參考: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
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。