在线不卡日本ⅴ一区v二区_精品一区二区中文字幕_天堂v在线视频_亚洲五月天婷婷中文网站

  • <menu id="lky3g"></menu>
  • <style id="lky3g"></style>
    <pre id="lky3g"><tt id="lky3g"></tt></pre>

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

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

    文章目錄

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

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

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

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

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

    ??1.1 客戶端WebSocket

    WebSocket 對(duì)象提供了用于創(chuàng)建和管理 WebSocket 連接,以及可以通過(guò)該連接 發(fā)送 和 接收數(shù)據(jù) 的 API。使用 WebSocket() 構(gòu)造函數(shù)來(lái)構(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)聽(tīng)客戶端與服務(wù)端的連接狀態(tài),如果客戶端與服務(wù)端 連接成功 則該事件觸發(fā),例子如下:

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

    2、webSocket.onclose

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

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

    3、webSocket: message event

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

    webSocket.addEventListener(‘message’, function (event) { console.log(‘來(lái)自服務(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依賴(lài)

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

    ??2.1.2 編寫(xiě)配置類(lèi)

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

    ??2.1.3 編寫(xiě)WebSocketService服務(wù)類(lèi)

    下面的 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)連接,如果沒(méi)有連接,那么將用戶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)聽(tīng)錯(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編寫(xiě),相關(guān)代碼如下

    ??2.2.1 主頁(yè)面

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

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

    ??2.2.1 聊天頁(yè)面

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

    小明

    翠花

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

    ??三、開(kāi)源地址

    • ??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í)通信

    ??收錄專(zhuān)欄:系統(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)刪除。
    (0)
    用戶投稿
    上一篇 2022年6月15日 18:27
    下一篇 2022年6月15日 18:27

    相關(guān)推薦

    聯(lián)系我們

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