【原創】基於Springboot、WebSocket的一對一聊天室
基於Springboot、WebSocket、STOMP協議、SockJS協議的一對一聊天室
作者:SGCoder,轉載需註明。
因為最近學校一個專案,需要實現與商家溝通的這麼一個需求,所以經過一段時間的網上收集資料,瞭解到了要主動讓伺服器推送訊息,更好的辦法就是採用WebSocket
技術
一.簡要介紹WebSocket
WebSocket協議是基於TCP的一種新的網路協議。它實現了瀏覽器與伺服器全雙工(full-duplex)通訊——允許伺服器主動傳送資訊給客戶端。
一般的輪詢,是通過Client間隔一定時間的向Server發出HTTP請求,讓Server迴應請求來達到實時更新資料的,但是這種方式有個明顯的缺點,當這個間隔時間很大時,就不可以實現真正的“實時更新”了,如果很小時,又會浪費很多無效的資源。 所以相對於輪詢,WebSocket是一種長連線的協議
二.簡要介紹STOMP協議與SockJS協議
1、STOMP協議是WebSocket的子協議,它是一個簡單的文字訊息傳輸協議,提供了一個可互操作的連線格式,允許STOMP客戶端與任意STOMP訊息代理(Broker)進行互動。 2、SockJS是一個JavaScript庫,提供跨瀏覽器JavaScript的API,建立了一個低延遲、全雙工的瀏覽器和web伺服器之間通訊通道。
其中WebSocket 是底層協議,SockJS
是WebSocket 的備選方案,也是底層協議,因為在部分瀏覽器中是不支援WebSocket協議的,因此採用SockJS作為備選的方案,而 STOMP
三.介紹主要程式碼
3.1、服務端程式碼
第一步:首先需要在Spring上下文中新增對WebSocket的配置
(1).需要為類新增@EnableWebSocketMessageBroker
註解,用於開啟使用STOMP協議,並且該類需要繼承WebSocketMessageBrokerConfigurer
類,也可以繼承AbstractWebSocketMessageBrokerConfigurer
(2).需要新增public void registerStompEndpoints()
方法,來註冊STOMP協議的節點,用於客戶端SoskJS連線
(3).配置訊息代理(Broker)
第二步:生成WebSocketController類,編寫介面邏輯
(1).用SpringBoot中操作WebSocket的SimpMessagingTemplate
類,並用該類的convertAndSendToUser
(引數一、引數二、引數三)方法,向指定客戶端推送訊息。
(2).convertAndSendToUser方法中的引數一為指定客戶端的使用者標識;引數二為設定的訪問伺服器的URL;引數三為傳送的訊息體。
3.2、客戶端程式碼
var stompClient = null;
//載入完瀏覽器後 呼叫connect(),開啟雙通道
$(function(){
//開啟雙通道
connect()
})
//強制關閉瀏覽器 呼叫websocket.close(),進行正常關閉
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已經連線成功');
stompClient = Stomp.over(socket);//使用STMOP子協議的WebSocket客戶端
stompClient.connect({},function(frame){//連線WebSocket服務端
console.log('Connected:' + frame);
stompClient.subscribe('/user/' + userId + '/queue/getResponse',function(response){
showResponse(response.body);
});
});
}
第一步:通過Stomp.over()
方法建立stompClient,引數為socket,並且該socket是由SockJS建立的,new SockJS()
的引數為前面WebSocketConfig類中配置的stomp節點路徑。
第二步:連線WebSocket服務端,通過stompClient.connect({},function(frame){}
。
第三步:通過stompClient.subscribe
訂閱/queue/getResponse 傳送的訊息,其中當userId與服務端指定的userId相同時,該客戶端才會收到服務端的推送訊息。
以上
最後貼上gitee程式碼,超連結->justCoding,謝謝瀏覽我的部落格。我會繼續記錄我的學習之旅。 我是SGCoder,下次再見!