1. 程式人生 > >【原創】基於Springboot、WebSocket的一對一聊天室

【原創】基於Springboot、WebSocket的一對一聊天室

基於Springboot、WebSocket、STOMP協議、SockJS協議的一對一聊天室

作者:SGCoder,轉載需註明。

因為最近學校一個專案,需要實現與商家溝通的這麼一個需求,所以經過一段時間的網上收集資料,瞭解到了要主動讓伺服器推送訊息,更好的辦法就是採用WebSocket技術

一.簡要介紹WebSocket

WebSocket協議是基於TCP的一種新的網路協議。它實現了瀏覽器與伺服器全雙工(full-duplex)通訊——允許伺服器主動傳送資訊給客戶端。

WebSocket與輪詢的差別 一般的輪詢,是通過Client間隔一定時間的向Server發出HTTP請求,讓Server迴應請求來達到實時更新資料的,但是這種方式有個明顯的缺點,當這個間隔時間很大時,就不可以實現真正的“實時更新”了,如果很小時,又會浪費很多無效的資源。 所以相對於輪詢,WebSocket是一種長連線的協議

,當Client第一次發出HTTP請求時,Server就與Client建立長連線,便於後面Server主動更新資料推送給Client。

二.簡要介紹STOMP協議與SockJS協議

1、STOMP協議是WebSocket的子協議,它是一個簡單的文字訊息傳輸協議,提供了一個可互操作的連線格式,允許STOMP客戶端與任意STOMP訊息代理(Broker)進行互動。 2、SockJS是一個JavaScript庫,提供跨瀏覽器JavaScript的API,建立了一個低延遲、全雙工的瀏覽器和web伺服器之間通訊通道。

其中WebSocket 是底層協議,SockJS 是WebSocket 的備選方案,也是底層協議,因為在部分瀏覽器中是不支援WebSocket協議的,因此採用SockJS作為備選的方案,而 STOMP

是基於 WebSocket(SockJS) 的上層協議。

三.介紹主要程式碼

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,下次再見!