小项目源码https://gitee.com/chen_yan_ting/web-socket_dou_di_zhu
实现原理:
WebSocket的onClose 连接关闭回调方法webSocket.onclose()
重新新建WebSocket() 建立一个连接 但是连接参数一模一样和原来的一模一样
后端的OnOpen()方法创建新的session 找到客户端对应对象 把对象里面的session替换成新的就实现重连了
//连接关闭回调方法
webSocket.onclose = function () {
console.log("连接关闭")
console.log("尝试重连")
reconnecting()
}
function reconnecting() {
webSocket = new WebSocket("ws://" + ip + ":9000/api/websocket/" + roomid + "/" + sid);
//监听服务器发送的消息
webSocket.onmessage = function (e) {
// console.log("收到消息");
// console.log(e.data);
if (e.data[0] === 'P') {
parsePoker(e.data);
}
if (e.data[0] === 'W') {
win(e.data)
}
}
//连接关闭回调方法
webSocket.onclose = function () {
console.log("连接关闭")
console.log("尝试重连")
reconnecting()
}
}
后端WebSocket的@OnOpen方法监控连接建立
@OnOpen
public void onOpen(Session session, @PathParam("roomid") String roomid, @PathParam("sid") String sid) {
每次连接建立都会有一个新的Session,这个Session就是和相应客户端通信的关键
// 存放每个客户端对应的MWebSocketServer对象
private static CopyOnWriteArraySet<WebSocketServer> webSocketSet = new CopyOnWriteArraySet<>();
CopyOnWriteArraySet 用于存储所有连接的客户端
所以可以遍历webSocketSet 通过重新建立连接传来的sid匹配原来断开连接的WebSocketServer 把WebSocketServer里面的session替换成新的session
for (WebSocketServer item : webSocketSet) {
// 找对应的客户端的对象 里面存着对应客户端的数据
if (item.roomid.equals(roomid) && item.sid.equals(sid) {
System.out.println("重连运行");
// 数据不变 只改session 就是通信变了
item.session = session;
reconnect = true;
}
}