前言:
?在上一篇文章中講到了WebSocket的原理击你,這節(jié)中我們先簡(jiǎn)單的編碼分析下,這樣有助于在之后的實(shí)戰(zhàn)編碼丸边。
說明:
(1)編碼中使用的Spring Boot版本是:1.5.8烛恤;
(2) 使用WebSocket有兩種方式: 第一種方式使用socketJS岛宦, 第二種方式是使用H5的標(biāo)準(zhǔn)阱佛。實(shí)例中使用的是第二種方式帖汞;
(3)最后提供源代碼;
編碼分析:
?在例子中凑术,我們需要編寫兩端的代碼:服務(wù)端和客戶端(當(dāng)然代碼都在一個(gè)工程里)翩蘸。
(1)Client:客戶端說明
?客戶端的代碼主要是使用H5的WebSocket進(jìn)行實(shí)現(xiàn),在前端網(wǎng)頁(yè)中使用WebSocket進(jìn)行連接服務(wù)端淮逊,然后建立Socket連接進(jìn)行通訊催首。
(2)Server:服務(wù)端說明
?服務(wù)端主要是建立多個(gè)客戶端的關(guān)系,進(jìn)行消息的中轉(zhuǎn)等泄鹏±扇危客戶端成功連接到服務(wù)端之后,就可以通過建立的通道進(jìn)行發(fā)送消息到服務(wù)端备籽,服務(wù)端接收到消息之后在群發(fā)給所有的客戶端舶治。
(3)客戶端和服務(wù)端怎么連接?
?客戶端通過JS中的WebSocket對(duì)象進(jìn)行連接到服務(wù)端:
? ? ? ?服務(wù)端映射出在上面使用的/websocket?端點(diǎn)呢车猬,使用注解@ServerEndpoint即可:
? ? ? ?當(dāng)客服端有連接請(qǐng)求了歼疮,服務(wù)端怎么接收請(qǐng)求,使用注解@OnOpen即可:
(4)客戶端和服務(wù)端怎么發(fā)送消息诈唬?
?客戶端可以使用webSocket提供的send()方法,如下代碼:
? ? ? ?服務(wù)端怎么發(fā)送消息呢缩麸?主要是使用在成功建立連接的時(shí)候铸磅,創(chuàng)建的Session對(duì)象進(jìn)行發(fā)送,如下代碼:
(5)客戶端和服務(wù)端怎么接收消息杭朱?
?客戶端接收消息消息使用的是websocket的onmessage回調(diào)方法阅仔,如下代碼:
? ? ? ?服務(wù)端怎么接收到消息,使用注解@OnMessage弧械,如下代碼:
(6)客戶端和服務(wù)端關(guān)閉連接處理八酒?
?客戶端使用websocket.close()進(jìn)行關(guān)閉連接;
?服務(wù)端使用@OnClose注解監(jiān)聽客戶端的關(guān)閉動(dòng)作刃唐。
(7)客戶端和服務(wù)端異常處理羞迷?
?客戶端當(dāng)有異常信息的時(shí)候會(huì)回調(diào)方法:websocket.onerror界轩;
?服務(wù)端使用@OnError注解監(jiān)聽異常信息。
(8)群聊原理(群發(fā)消息)
?服務(wù)端在和客戶端建立連接的時(shí)候衔瓮,會(huì)創(chuàng)建一個(gè)webSocket對(duì)象浊猾,我們會(huì)將每個(gè)連接創(chuàng)建的對(duì)象進(jìn)行報(bào)錯(cuò)到一個(gè)列表中,比如:CopyOnWriteArraySet(這是線程安全的)热鞍;在要進(jìn)行群發(fā)的時(shí)候葫慎,編寫我們的列表對(duì)象進(jìn)行群發(fā)消息。
(9)單聊原理(一對(duì)一消息)
?單聊的時(shí)候薇宠,就無需遍歷列表偷办,而是需要知道發(fā)送者和接受者各自的Session對(duì)象,這個(gè)Session對(duì)象怎么獲取呢澄港?Session可以獲取到sessionId椒涯,發(fā)送者在發(fā)送消息的時(shí)候,攜帶接收消息的sessionId慢睡,那么問題就演變成了:發(fā)送者怎么知道接受者的sessionId逐工,那就是加入一個(gè)在線用戶列表即可,在線用戶列表中有用戶的基本信息漂辐,包括sessionId泪喊。
?明白了這些,在接下里的編碼中就會(huì)輕松很多髓涯。