小项目源码/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方法监控连接建立
@OnOpenpublic 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;} }