WebSocket的心跳检测和重连和Spring的整合

最近搞好论文,对其中的WebSocket中相对比较实用的技术作一个总结,这个东西以前是用来做先后台的监控数据的实时通讯,主要记录一下心跳包和重连的过程,websocket中的心跳这里是经过客户端定义一个定时器实现,主要代码以下:javascript

//心跳检测,每20s心跳一次
var heartCheck = {
    timeout: 20000,
    timeoutObj: null,
    serverTimeoutObj: null,
    reset: function(){
        clearTimeout(this.timeoutObj);
        clearTimeout(this.serverTimeoutObj);
        return this;
    },
    start: function(){
        var self = this;
        this.timeoutObj = setTimeout(function(){
            //这里发送一个心跳,后端收到后,返回一个心跳消息,
            //onmessage拿到返回的心跳就说明链接正常
            ws.send("HeartBeat" + new Date().format("yyyy-MM-dd hh:mm:ss"));
            console.info("客户端发送心跳:" + new Date().format("yyyy-MM-dd hh:mm:ss"));
            self.serverTimeoutObj = setTimeout(function(){//若是超过必定时间还没重置,说明后端主动断开了
                ws.close();//若是onclose会执行reconnect,咱们执行ws.close()就好了.若是直接执行reconnect 会触发onclose致使重连两次
            }, self.timeout)
        }, this.timeout)
    }
}

服务器在接受到心跳信息时必须给予它回应,否则客户端会默认二者断开进行重连的行为,后台的回应代码以下:前端

session.sendMessage(new TextMessage("服务器的心跳回应-HeartBeat" + sdf.format(new Date())));

每次客户端接受到后台心跳回应时或者推送的数据就须要将定时器重置计数,主要代码以下:java

ws.onopen = function () {
        //心跳检测重置
        heartCheck.reset().start();
    };
    ws.onmessage = function (event) {
        console.info(event.data);

        //若是获取到消息,心跳检测重置
        heartCheck.reset().start();
    }

Spring的配置文件正常写就能够了(必定要将webSocket的配置文件和握手文件交给Spring来管理,因此在组件扫描的时候须要将上述两个文件所在的基类包加入到扫描路径下),最终的效果以下所示:
这里写图片描述
这里写图片描述
上述的是服务器每隔30s推送一次数据,前端每隔20s心跳一次,若是传输异常或者在下次心跳前没有接受到心跳回应,就会进行重连,这里是将服务器中止做断开测试,而后再启动便可,主要完整的Demo见:https://github.com/Jacksonary/CodeRepository/tree/df56122c141e29eb048b5200d6cfe4fe0a96dd2e/websocket
在线演示案例:WebSocket在线演示案例,打开控制台查看便可,git

我没有做单例处理,因此若是有人访问过了,会出现连续新服务器的推送状况,把Demo搞下来本地跑便可,多客户端的案例须要自行处理一下github