Java websocket 在负载均衡上实现单对单通讯

       由于公司项目需要用到websocket进行通讯,服务器采用负载均衡模式。由于WebSocketSession对象无法实例化的问题,导致无法使用Redis进行存储。如果一个用户连接进01主机,一个用户连接02主机,那么他们之间就无法实现单对单通讯,因为数据都保存在不同的Session域中。

       思路(图片来自Java-websocket开发交流2群):


Java websocket 在负载均衡上实现单对单通讯_第1张图片
Java websocket 在负载均衡上实现单对单通讯_第2张图片
Java websocket 在负载均衡上实现单对单通讯_第3张图片
Java websocket 在负载均衡上实现单对单通讯_第4张图片

1. 依照图中思路,实现不同主机登录的用户也能通讯。至于怎么实现握手的,百度一堆,这里就不讲了。

保存用户的session到集合中,并且把用户登录的服务器IP保存到Redis中。



直接上代码

1. 先建一个UserSocket类,实现序列化接口

Java websocket 在负载均衡上实现单对单通讯_第5张图片

2. 当用户握手成功时保存用户ID和本机IP到Redis并且用户的ID和WebSocketSession保存到全局变量中


Java websocket 在负载均衡上实现单对单通讯_第6张图片
Java websocket 在负载均衡上实现单对单通讯_第7张图片

3.  Redis存储

新建一个RedisDao类


Java websocket 在负载均衡上实现单对单通讯_第8张图片

在spring-mybatis.xml中配置


Java websocket 在负载均衡上实现单对单通讯_第9张图片

在RedisDao类中中创建函数存取对象到Redis中


Java websocket 在负载均衡上实现单对单通讯_第10张图片
Java websocket 在负载均衡上实现单对单通讯_第11张图片

新建一个序列化对象的类,


Java websocket 在负载均衡上实现单对单通讯_第12张图片
Java websocket 在负载均衡上实现单对单通讯_第13张图片

4. 通过接口统一发送到指定用户

 判断接收信息的用户是否在本IP中,如果不在同一个IP,转发给用户所在的IP接口处理


Java websocket 在负载均衡上实现单对单通讯_第14张图片
Java websocket 在负载均衡上实现单对单通讯_第15张图片

5.Java post数据实现 (注意编码)


Java websocket 在负载均衡上实现单对单通讯_第16张图片
Java websocket 在负载均衡上实现单对单通讯_第17张图片

以上即可以实现不同主机中的用户相互通讯

由于该方法虽然能实现不同主机中的用户单对单聊天,但也有存在bug未处理。如果有更好的方式请通知我哈,一起交流交流。

.

你可能感兴趣的:(Java websocket 在负载均衡上实现单对单通讯)