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

       由于公司项目需要用到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未处理。如果有更好的方式请通知我哈,一起交流交流。

.

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,492评论 11 349
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 176,034评论 25 709
  • 她不听你的,不陪在你身边,不给你洗衣煮饭,孩子也大了。这样的老婆,你要她干嘛? 某大腕人物收到他下属的辞职信,再三...
    兰兮阅读 5,010评论 51 31
  • 磨刀不误砍柴工,想读的书那么多,想学习的东西那么多,想去实践的东西那么多。但是自己的速度却这么慢,吸收的能力这么慢...
    麦花魔法花园阅读 2,688评论 0 1
  • 从前有座山,山里有座庙,庙里有个和尚和老道。老道给和尚讲故事说:
    未眠传说阅读 1,283评论 2 0

友情链接更多精彩内容