亚洲精品中文免费|亚洲日韩中文字幕制服|久久精品亚洲免费|一本之道久久免费

      
      

            <dl id="hur0q"><div id="hur0q"></div></dl>

                SpringBoot整合websocket實(shí)現(xiàn)及時(shí)通信聊天

                SpringBoot整合websocket實(shí)現(xiàn)及時(shí)通信聊天

                文章目錄

                ??一、技術(shù)介紹

                線上演示地址: http://chat.breez.work

                實(shí)時(shí)通信 (Instant Messaging,簡(jiǎn)稱IM)是一個(gè) 實(shí)時(shí) 通信系統(tǒng),允許兩人或多人使用網(wǎng)絡(luò)實(shí)時(shí)的傳遞 文字消息 、 文件 、 語音 與 視頻交流 。[4]

                場(chǎng)景再現(xiàn):

                • ??微信聊天
                • ??QQ聊天
                • ??網(wǎng)站在線客服

                ??1.1 客戶端WebSocket

                WebSocket 對(duì)象提供了用于創(chuàng)建和管理 WebSocket 連接,以及可以通過該連接 發(fā)送 和 接收數(shù)據(jù) 的 API。使用 WebSocket() 構(gòu)造函數(shù)來構(gòu)造一個(gè) WebSocket。[1]

                構(gòu)造函數(shù)如下所示:

                const webSocket = WebSocket(url[, protocols])

                例子如下:

                const webSocket = new WebSocket(“ws://42.193.120.86:3688/ws/小明/翠花”)

                ??1.1.1 函數(shù)

                1、 webSocket.send()

                該函數(shù)用于向服務(wù)端發(fā)送一條消息,例子如下:

                webSocket.send(“Hello server!”);

                2、 webSocket.close()

                該函數(shù)用于關(guān)閉客戶端與服務(wù)端的連接,例子如下:

                webSocket.close();

                ??1.1.2事件

                1、webSocket.onopen

                該事件用于監(jiān)聽客戶端與服務(wù)端的連接狀態(tài),如果客戶端與服務(wù)端 連接成功 則該事件觸發(fā),例子如下:

                webSocket.onopen = function(event) { console.log(“連接已經(jīng)建立,可以進(jìn)行通信”);};

                2、webSocket.onclose

                如果服務(wù)端與客戶端連接斷開,那么此事件出發(fā),例子如下:

                webSocket.onclose = function(event) { console.log(“連接已經(jīng)關(guān)閉”);};

                3、webSocket: message event

                該事件用于監(jiān)聽服務(wù)端向客戶端發(fā)送的消息,例子如下:

                webSocket.addEventListener(‘message’, function (event) { console.log(‘來自服務(wù)端的消息:’, event.data);});

                4、webSocket:error event

                如果客戶端與服務(wù)端發(fā)生錯(cuò)誤時(shí),那么此事件將會(huì)觸發(fā),例子如下:

                webSocket.addEventListener(‘error’, function (event) { console.log(‘連接出現(xiàn)錯(cuò)誤’, event);});

                ??1.2 服務(wù)端WebSocket

                @ServerEndpoint 用于聲明一個(gè)socket服務(wù),例子如下:

                @ServerEndpoint(value = “/ws/{userId}/{targetId}”)

                幾個(gè)重要的 方法 注解:

                @OnOpen@OnClose@OnMessage@OnError

                ??二、實(shí)戰(zhàn)

                ??2.1、服務(wù)端

                ??2.1.1引入maven依賴

                org.springframework.boot spring-boot-starter-websocket

                ??2.1.2 編寫配置類

                @Configurationpublic class WebSocketConfig { @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); }}

                ??2.1.3 編寫WebSocketService服務(wù)類

                下面的 userId 代表 發(fā)送者 的ID號(hào), target 代表 發(fā)送目標(biāo) ID號(hào)。

                @Component@ServerEndpoint(value = “/ws/{userId}/{target}”)public class WebSocketService { //用于保存連接的用戶信息 private static ConcurrentHashMap SESSION = new ConcurrentHashMap(); //原子遞增遞減,用于統(tǒng)計(jì)在線用戶數(shù) private static AtomicInteger count = new AtomicInteger(); //消息隊(duì)列,用于保存待發(fā)送的信息 private Queue queue = new LinkedBlockingDeque(); //onOpen() //onClose() //onMessage() //onError()}

                ??2.1.4 建立連接

                建立連接之前,判斷用戶是否已經(jīng)連接,如果沒有連接,那么將用戶session信息保存到集合,然后計(jì)數(shù)器遞增。

                @OnOpen public void onOpen(Session session, @PathParam(“userId”) String userId) { if (!SESSION.containsKey(userId)) { SESSION.put(userId, session); count.incrementAndGet(); } }

                ??2.1.5 關(guān)閉連接

                關(guān)閉連接的時(shí)候,將用戶session刪除和計(jì)數(shù)器遞減。

                @OnClose public void onClose(@PathParam(“userId”) String userId) { SESSION.remove(userId); count.decrementAndGet(); }

                ??2.1.6 發(fā)送消息

                發(fā)送采用的方法是: session.getBasicRemote().sendText(“你好”);

                @OnMessage public void onMessage(String message, @PathParam(“userId”) String userId, @PathParam(“target”) String target) throws IOException { queue.add(message); Session s = SESSION.get(target); if (s == null) { Session b = SESSION.get(userId); b.getBasicRemote().sendText(“對(duì)方不在線”); } else { for (int i = 0; i < queue.size(); i++) { String msg = queue.poll(); Message m = new Message(); m.setUserId(userId); s.getBasicRemote().sendText(msg); } } }

                ??2.1.7 監(jiān)聽錯(cuò)誤

                出現(xiàn)錯(cuò)誤,刪除用戶session信息和計(jì)數(shù)器遞減

                @OnError public void onError(Throwable error, @PathParam(“userId”) String userId) { SESSION.remove(userId); count.decrementAndGet(); error.printStackTrace(); }

                ??2.2 客戶端

                本案例中客戶端采用Nuxt編寫,相關(guān)代碼如下

                ??2.2.1 主頁面

                運(yùn)行截圖如圖所示:

                歡迎使用喵喵號(hào)聊天 聊一下 body { background: url(‘../static/img/cat.jpg’); }

                ??2.2.1 聊天頁面

                運(yùn)行截圖如下:

                小明

                翠花

                我的喵喵號(hào):{{user.userId}} 對(duì)方喵喵號(hào):{{user.targetId}} 清空消息 {{m.msg}} {{m.msg}} 系統(tǒng)消息:{{m.msg}} 發(fā)送

                ??三、開源地址

                • ??Gitee: https://gitee.com//websocket
                • 演示地址: http://chat.breez.work

                ??四、參考文獻(xiàn)

                • [1]MDN: WebSocket
                • [2]Nuxt: https://nuxtjs.org
                • [3]Vue: https://cn.vuejs.org
                • [4]百度百科: 及時(shí)通信

                ??收錄專欄:系統(tǒng)設(shè)計(jì)與實(shí)戰(zhàn)

                原文鏈接:https://blog.csdn.net/m0_54853420/article/details/125244263?utm_source=tuicool&utm_medium=referral

                鄭重聲明:本文內(nèi)容及圖片均整理自互聯(lián)網(wǎng),不代表本站立場(chǎng),版權(quán)歸原作者所有,如有侵權(quán)請(qǐng)聯(lián)系管理員(admin#wlmqw.com)刪除。
                用戶投稿
                上一篇 2022年6月15日 18:27
                下一篇 2022年6月15日 18:27

                相關(guān)推薦

                • ios手游模擬器(手游模擬器ios)

                  本文主要講的是ios手游模擬器,以及和手游模擬器ios相關(guān)的知識(shí),如果覺得本文對(duì)您有所幫助,不要忘了將本文分享給朋友。 哪個(gè)iOS模擬器能多開手游賬號(hào)?可以推薦個(gè)好用的模擬器給我嗎…

                  2022年11月27日
                • 短視頻策劃內(nèi)容的3個(gè)要點(diǎn)(短視頻策劃內(nèi)容怎么做)

                  短視頻在制作時(shí),內(nèi)容框架非常重要。如果直奔主題,然后結(jié)束,聚卓告訴你,這樣的短視頻已經(jīng)過時(shí)了。現(xiàn)在的短視頻需要框架的,但不是任何框架,它需要一種易于理解和消化的框架。而且,現(xiàn)在大多…

                  2022年11月27日
                • 美團(tuán)第三季度實(shí)現(xiàn)營(yíng)收626億元,即時(shí)配送訂單量增至50億筆

                  新京報(bào)訊(記者秦勝南)11月25日,美團(tuán)發(fā)布業(yè)績(jī)公告顯示,第三季度營(yíng)收為626億元,較去年同比增長(zhǎng)28.2%,凈利潤(rùn)為12.2億元。第三季度,美團(tuán)即時(shí)配送訂單數(shù)增長(zhǎng)至50億筆。截至…

                  2022年11月27日
                • 存儲(chǔ)過程語法(sql server存儲(chǔ)過程語法)

                  今天小編給各位分享存儲(chǔ)過程語法的知識(shí),其中也會(huì)對(duì)sql server存儲(chǔ)過程語法進(jìn)行解釋,如果能碰巧解決你現(xiàn)在面臨的問題,別忘了關(guān)注本站,現(xiàn)在開始吧! oracle存儲(chǔ)過程基本語法…

                  2022年11月26日
                • 劉畊宏回應(yīng)梅西輸球后哭了:跳操流汗到眼睛 剛好有點(diǎn)流鼻水

                  11月23日,劉畊宏發(fā)言回應(yīng)自己再梅西輸球后流淚的消息,他寫道:“我是有些難過… 然后…跳操流汗到眼睛,剛好有點(diǎn)流鼻水,阿根廷之后的比賽會(huì)贏的!”據(jù)悉,11月22日的世界杯比賽中,…

                  2022年11月26日
                • 個(gè)人怎么做抖音帶貨(個(gè)人做抖音帶貨能賺錢嗎)

                  抖音如今是大家很熟悉的短視頻平臺(tái),不過現(xiàn)在的抖音卻不只是短視頻那么簡(jiǎn)單,它的功能非常豐富,其中一個(gè)就是可以帶貨,相信很多小伙伴都有在抖音上買過東西,抖音如今的變現(xiàn)能力也是不容小覷的…

                  2022年11月25日
                • EDG粉絲酸了!JDG重磅官宣,頂級(jí)打野Kanavi留在LPL賽區(qū)

                  2022英雄聯(lián)盟職業(yè)聯(lián)賽冬季轉(zhuǎn)會(huì)期已經(jīng)于11月22日拉開帷幕,在轉(zhuǎn)會(huì)期首日作為L(zhǎng)PL觀眾關(guān)注的焦點(diǎn)的JDG戰(zhàn)隊(duì),就官宣了Yagao離隊(duì)以及Homme續(xù)約的消息,這讓人十分意外。畢竟…

                  2022年11月25日
                • 商家收到貨才會(huì)退款嗎(淘寶代付款退款錢到哪里了)

                  在淘寶上有一些人下單購(gòu)買商品的時(shí)候是通過代付的形式來支付的,一般情況下是家長(zhǎng)幫助家里的小孩或者長(zhǎng)輩進(jìn)行代付,而代付訂單和普通的訂單沒有太大的區(qū)別,不過如果發(fā)生退款的話,錢是退到哪里…

                  2022年11月25日
                • 小紅書平臺(tái)的一些機(jī)制及玩法詳解(小紅書玩法有哪些)

                  關(guān)于小紅書 一:小紅書平臺(tái)的一些機(jī)制 1. 筆記內(nèi)容的CES評(píng)分機(jī)制 2. 筆記流量入口與長(zhǎng)尾效應(yīng) 二:小紅書優(yōu)質(zhì)筆記的特點(diǎn)(分維度、類型分析) 1.筆記的本身架構(gòu)組成 維度 2.…

                  2022年11月25日
                • 百度關(guān)鍵詞快速排名的4大原理解析(百度怎么刷關(guān)鍵詞)

                  近期百度公告驚雷算法2.0,升級(jí)之快還是第一次吧,看來百度對(duì)于刷點(diǎn)擊行為是零容忍了。之前尹華峰SEO技術(shù)博客介紹過一篇如何使用刷點(diǎn)擊工具,其實(shí)市面上有很多這類SEO快速排名的軟件,…

                  2022年11月25日

                聯(lián)系我們

                聯(lián)系郵箱:admin#wlmqw.com
                工作時(shí)間:周一至周五,10:30-18:30,節(jié)假日休息