javascript
【原创】基于Springboot、WebSocket的一对一聊天室
版權(quán)聲明:本文為博主ExcelMann的原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。
基于Springboot、WebSocket、STOMP協(xié)議、SockJS協(xié)議的一對一聊天室
作者:ExcelMann,轉(zhuǎn)載需注明。
因?yàn)樽罱鼘W(xué)校一個(gè)項(xiàng)目,需要實(shí)現(xiàn)與商家溝通的這么一個(gè)需求,所以經(jīng)過一段時(shí)間的網(wǎng)上收集資料,了解到了要主動讓服務(wù)器推送消息,更好的辦法就是采用WebSocket技術(shù)
一.簡要介紹WebSocket
WebSocket協(xié)議是基于TCP的一種新的網(wǎng)絡(luò)協(xié)議。它實(shí)現(xiàn)了瀏覽器與服務(wù)器全雙工(full-duplex)通信——允許服務(wù)器主動發(fā)送信息給客戶端。
一般的輪詢,是通過Client間隔一定時(shí)間的向Server發(fā)出HTTP請求,讓Server回應(yīng)請求來達(dá)到實(shí)時(shí)更新數(shù)據(jù)的,但是這種方式有個(gè)明顯的缺點(diǎn),當(dāng)這個(gè)間隔時(shí)間很大時(shí),就不可以實(shí)現(xiàn)真正的“實(shí)時(shí)更新”了,如果很小時(shí),又會浪費(fèi)很多無效的資源。
所以相對于輪詢,WebSocket是一種長連接的協(xié)議,當(dāng)Client第一次發(fā)出HTTP請求時(shí),Server就與Client建立長連接,便于后面Server主動更新數(shù)據(jù)推送給Client。
二.簡要介紹STOMP協(xié)議與SockJS協(xié)議
1、STOMP協(xié)議是WebSocket的子協(xié)議,它是一個(gè)簡單的文本消息傳輸協(xié)議,提供了一個(gè)可互操作的連接格式,允許STOMP客戶端與任意STOMP消息代理(Broker)進(jìn)行交互。
2、SockJS是一個(gè)JavaScript庫,提供跨瀏覽器JavaScript的API,創(chuàng)建了一個(gè)低延遲、全雙工的瀏覽器和web服務(wù)器之間通信通道。
其中WebSocket 是底層協(xié)議,SockJS 是WebSocket 的備選方案,也是底層協(xié)議,因?yàn)樵诓糠譃g覽器中是不支持WebSocket協(xié)議的,因此采用SockJS作為備選的方案,而 STOMP 是基于 WebSocket(SockJS) 的上層協(xié)議。
三.介紹主要代碼
3.1、服務(wù)端代碼
第一步:首先需要在Spring上下文中添加對WebSocket的配置
(1).需要為類添加@EnableWebSocketMessageBroker注解,用于開啟使用STOMP協(xié)議,并且該類需要繼承WebSocketMessageBrokerConfigurer類,也可以繼承AbstractWebSocketMessageBrokerConfigurer
(2).需要添加public void registerStompEndpoints()方法,來注冊STOMP協(xié)議的節(jié)點(diǎn),用于客戶端SoskJS連接
(3).配置消息代理(Broker)
第二步:生成WebSocketController類,編寫接口邏輯
(1).用SpringBoot中操作WebSocket的SimpMessagingTemplate類,并用該類的convertAndSendToUser(參數(shù)一、參數(shù)二、參數(shù)三)方法,向指定客戶端推送消息。
(2).convertAndSendToUser方法中的參數(shù)一為指定客戶端的用戶標(biāo)識;參數(shù)二為設(shè)定的訪問服務(wù)器的URL;參數(shù)三為發(fā)送的消息體。
3.2、客戶端代碼
var stompClient = null; //加載完瀏覽器后 調(diào)用connect(),打開雙通道 $(function(){ //打開雙通道 connect() }) //強(qiáng)制關(guān)閉瀏覽器 調(diào)用websocket.close(),進(jìn)行正常關(guān)閉 window.onunload = function() {disconnect() } function connect(){var userId='1';var socket = new SockJS('http://127.0.0.1:8080/endpointOyzc'); //連接SockJS的endpoint名稱為"endpointOyzc"console.log('我userId1已經(jīng)連接成功');stompClient = Stomp.over(socket);//使用STMOP子協(xié)議的WebSocket客戶端stompClient.connect({},function(frame){//連接WebSocket服務(wù)端 console.log('Connected:' + frame);stompClient.subscribe('/user/' + userId + '/queue/getResponse',function(response){ showResponse(response.body);});}); }第一步:通過Stomp.over()方法創(chuàng)建stompClient,參數(shù)為socket,并且該socket是由SockJS創(chuàng)建的,new SockJS()的參數(shù)為前面WebSocketConfig類中配置的stomp節(jié)點(diǎn)路徑。
第二步:連接WebSocket服務(wù)端,通過stompClient.connect({},function(frame){}。
第三步:通過stompClient.subscribe訂閱/queue/getResponse 發(fā)送的消息,其中當(dāng)userId與服務(wù)端指定的userId相同時(shí),該客戶端才會收到服務(wù)端的推送消息。
以上
gitee項(xiàng)目地址:https://gitee.com/XuXuanGan/OnlineChatDemo
總結(jié)
以上是生活随笔為你收集整理的【原创】基于Springboot、WebSocket的一对一聊天室的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux架设代理服务器
- 下一篇: Uva Oj 514 - Rails