# websocketcluster **Repository Path**: taowei/simplewebsocket ## Basic Information - **Project Name**: websocketcluster - **Description**: webSocket集群功能简单实现 在tomcat集群环境下,客户端只能与一个tomcat建立websocket连接,如果服务器向客户端发消息,则不知道哪个tomcat与此客户端建立的连接. 如果是http的会话信息可以通过缓存共享(如用Redis存会话信息), 但是webSocket的连接是不可以序列化的,也就没法共享. 所以解决问题的思路是: 当一个客户端与tomcat建立websocket连接, 则把此连接信息与相应的sessionid或用户id形成键值对放在本机内存的map中. 在集群环境下还要引入消息队列的概念, 可以用订阅/发布的模式,可以采用自己熟悉的消息框架, 此项目中采用了hazelcast的消息队列(简单,不需要额外启服务), tomcat启动时自动启动消息监听(代码中已实现), 当服务端向某个客户端通信时, 先在集群的tomcat上发布消息, 此消息包含sessionid及向客户通信的内容, 当订阅了消息的tomcat收到消息后, 检查本机的map中是否包含此sessionid, 如果不包含则忽略,如果包含则取出此sessionid对应的连接,然后向客户端发送 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2017-09-21 - **Last Updated**: 2021-10-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # simplewebsocket webSocket集群功能简单实现
在tomcat集群环境下,客户端只能与一个tomcat建立websocket连接,如果服务器向客户端发消息,则不知道哪个tomcat与此客户端建立的连接. 如果是http的会话信息可以通过缓存共享(如用Redis存会话信息), 但是webSocket的连接是不可以序列化的,也就没法共享. 所以解决问题的思路是:
当一个客户端与tomcat建立websocket连接, 则把此连接信息与相应的sessionid或用户id形成键值对放在本机内存的map中. 在集群环境下还要引入消息队列的概念, 可以用订阅/发布的模式,可以采用自己熟悉的消息框架, 此项目中采用了hazelcast的消息队列(简单,不需要额外启服务), tomcat启动时自动启动消息监听(代码中已实现), 当服务端向某个客户端通信时, 先在集群的tomcat上发布消息, 此消息包含sessionid及向客户通信的内容, 当订阅了消息的tomcat收到消息后, 检查本机的map中是否包含此sessionid, 如果不包含则忽略,如果包含则取出此sessionid对应的连接,然后向客户端发送相应内容进行交互.
项目使用
1.先将webSocket-hazelcast.xml放到自己项目的WEB-INF下.
2.在web.xml中注册监听事件com.tw.listener.WebSocketListener
3.启动tomcat

webSocket-hazelcast.xml说明
此配置文件主要配置消息要广播或发送到指定IP的服务器地址列表.参考其中的解释修改IP即可

注意:
需要Tomcat8以上,因为websocket需要使用到websocket-api.jar的包