Java websocket+ nginx+redis負載均衡上實現單對單通訊


參考:https://www.jianshu.com/p/e25f7a48534d

由於公司項目需要用到websocket進行通訊,服務器采用負載均衡模式。由於WebSocketSession對象無法實例化的問題,導致無法使用Redis進行存儲。如果一個用戶連接進01主機,一個用戶連接02主機,那么他們之間就無法實現單對單通訊,因為數據都保存在不同的Session域中。

       思路(圖片來自Java-websocket開發交流2群):

 

 
 
 
 
 
 
 
 

1. 依照圖中思路,實現不同主機登錄的用戶也能通訊。至於怎么實現握手的,百度一堆,這里就不講了。

保存用戶的session到集合中,並且把用戶登錄的服務器IP保存到Redis中。

 

 
 

 

直接上代碼

1. 先建一個UserSocket類,實現序列化接口

 
 

2. 當用戶握手成功時保存用戶ID和本機IP到Redis並且用戶的ID和WebSocketSession保存到全局變量中

 

 
 
 
 

3.  Redis存儲

新建一個RedisDao類

 

 
 

在spring-mybatis.xml中配置

 

 
 

在RedisDao類中中創建函數存取對象到Redis中

 

 
 
 
 

新建一個序列化對象的類,

 

 
 
 
 

4. 通過接口統一發送到指定用戶

 判斷接收信息的用戶是否在本IP中,如果不在同一個IP,轉發給用戶所在的IP接口處理

 

 
 
 
 
 
 

5.Java post數據實現 (注意編碼)

 

 
 
 
 

以上即可以實現不同主機中的用戶相互通訊

由於該方法雖然能實現不同主機中的用戶單對單聊天,但也有存在bug未處理。如果有更好的方式請通知我哈,一起交流交流。



作者:No剎那光輝
鏈接:https://www.jianshu.com/p/e25f7a48534d
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM