给websocket加入心跳包防止自动断开连接
var userId = $("#userId").val();
var lockReconnect = false; //避免ws重复连接
var ws = null; //判断当前浏览器是否支持WebSocket
var wsUrl = serverConfig.cyberhouse_ws+userId;
createWebSocket(wsUrl); //连接wsfunction createWebSocket(url) {try {if ('WebSocket' in window) {ws = new WebSocket(url);} else if ('MozWebSocket' in window) {ws = new MozWebSocket(url);} else {layui.use(['layer'], function() {var layer = layui.layer;layer.alert("您的浏览器不支持websocket的协议,建议使用新版谷歌、火狐等浏览器,请勿使用IE10以下浏览器,360浏览器请使用极速模式,不要使用兼容模式!");});}initEventHandle();} catch(e) {reconnect(url);console.log(e);}
}function initEventHandle() {ws.onclose = function() {reconnect(wsUrl);console.log("llws连接关闭!"+new Data().toUTCString());};ws.onerror = function() {reconnect(wsUrl);console.log("llws连接错误!");};ws.onopen = function() {heartCheck.reset().start(); //心跳检测重置console.log("llws连接成功!"+new Data().toUTCString());};ws.onmessage = function(event) {//如果获得到消息、心跳检测重置heartCheck.reset().start(); //拿到任何消息都说明当前连接是正常的console.log("llws收到消息啦:"+event.data);if (event.data != 'pong') {var obj = eval("("+event.data+")");layui.use(['layim'], function(layim) {if (obj.type == "onlineStatus") {layim.setFriendStatus(obj.id, obj.content);} else if (obj.type == "friend" || obj.type == "group") {layim.getMessage(obj);}});}};
}//监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server断会抛异常
window.onbeforeunload = function() {ws.close();
}function reconnect(url) {if (lockReconnect) return;lockReconnect = true;setTimeout(function() { //没连接上会一直重连,设置延迟避免请求过多createWebSocket(url);lockReconnect = false;}, 2000);
}//心跳检测
var heartCheck = {timeout: 540000, //9分钟发一次心跳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("ping");console.log("ping!");self.serverTimeoutObj = setTimeout(function() {//如果超过一定时间还没重置,说明后端主动断开了ws.close(); //如果onclose会执行reconnect,我们执行ws.close()就行了,如果直接执行reconnect会触发onclose导致重连两次}, self.timeout)}, this.timeout)}
}
//收到客户端消息后调用的方法
@OnMessage
public void onMessage(String message, Session session) {if (message.equals("ping")) {} else {...}
}
系统发现websocket每隔10分钟自动断开连接,搜了很多博客都说设置一下nignx的
keepalive_timeout
proxy_send_timeout
proxy_connect_timeout
proxy_read_timeout
这四个字段的时长即可,然而好像并不生效。遂采取心跳包的方式每隔9分钟客户端自动发送ping消息给服务端,服务端不需要返回。即可解决问题。
转自:https://blog.csdn.net/jkxqj/article/details/77848466
给websocket加入心跳包防止自动断开连接相关推荐
- java websocket心跳包_给websocket加入心跳包防止自动断开连接
reconnect(url) { if(lockReconnect) return; lockReconnect = true; setTimeout(function () { //没连接上会一直重 ...
- 阿里云轻量应用服务器闲置时间过长自动断开连接
问题描述 阿里云轻量应用服务器闲置时间过长自动断开连接,并且如果在本地使用远程连接工具,打开多个窗口,一段时间误操作,会进入卡死状态,就是输入任何命令都没有任何反应,导致工作效率严重低下. 解决方案 ...
- 云服务器自动断开连接的解决办法
使用smarTTY连接腾讯云服务器一会不用就会自动断开连接,解决方法如下: 1. 找到sshd_config配置文件 vi /etc/ssh/sshd_config 使用vi打开进行编辑,在文件中找到 ...
- 腾讯云服务器自动断开连接的解决办法
腾讯云服务器自动断开连接的解决办法 1.找到sshd_config配置文件 打开并进行编辑,输入命令: vim /etc/ssh/sshd_config 在此文件中找到以下配置项: # ClientA ...
- Linux的SSH登录超时自动断开连接设置
关于ssh登录超时断开连接的设置有两个方面可以设置 1.修改sshd服务的配置文件sshd_config的内容 #ClientAliveInterval 0 指定了服务器向客户端请求消息的时间间隔 ...
- dbcp连接mysql,8小时会自动断开连接
为什么80%的码农都做不了架构师?>>> 最近自己做一个项目用到dbcp连接mysql,开始时很正常,可是第二天再访问服务时就出问题了,mysql连接关闭了. mysql在空闲 ...
- oracle多久断开连接,Oracle自动断开连接
ORACLE自动断开数据库连接解决办法 最近,有客户提出在系统的应用中出现数据库频繁自动断开连接(每10分钟)的异常现象,通过查找学习,找到如下两种解决方法.供大家参考. 方法一.直接修改资源配置文件 ...
- win7怎么连接不上宽带连接服务器未响应,win7宽带自动断开连接怎么办 win7宽带连接不上的快速解决方法...
近日很多使用wn7系统的用户出现宽带自动断开连接的情况,大家知道该怎么解决吗?其实这种情况小编也遇到过,下面就为大家分享下小编遇到宽带自动断开连接的解决方法吧!大家如果没有其他的方法部分参照下面的步骤 ...
- 【SSH】SSH自动断开连接的原因和解决办法|SSH保持长连接方法
目录 原因 解决方法 即看即用 方法1:手工修改 方法2:shell命令行修改 详细说明 REMOTE HOST IDENTIFICATION HAS CHANGED问题解决 原因 用putty/Se ...
最新文章
- xmlHttpRequest避免缓存的办法
- 基于TableStore的数据采集分析系统介绍
- win7如何取消计算机管理员权限,win7如何删除需要管理员权限的文件夹
- java实现word邮件合并,Aspose.Words控件操作实例—邮件合并功能概述
- Google DeepMind围棋程序AlphaGo的分析
- 中通知设置响铃_主动切断干扰源——手机“通知”精细化管理
- stata 线性回归分析基本操作
- 计算机图形学几何变换
- 深度解读智慧农业传感器及应用
- Mac安装Mysql(图文解说详细版)
- GeoDa 空间自相关操作步骤
- matlab2010安装详细图解案例
- 【Materials Studio学习七】构建石墨烯
- 使用Spring实现AOP的三种方式
- 使用Laravel提交POST请求出现The page has expired due to inactivity错误
- ios 内存深度优化_iOS内存优化
- Fruit Ripeness论文、代码和数据集汇总
- opera mini android apk,Download Opera Mini APK Android
- GPS差分——差分定位
- 02_平面转换 transform
热门文章
- Gradle增量编译(六)
- Paxos Made Simple 中文翻译
- lucene的数据类型
- flink event-time 和连续窗口的使用
- Leecode 869. 重新排序得到 2 的幂——Leecode每日一题系列
- 12行代码AC——L1-058 6翻了(15分)
- 应该掌握的神奇函数——sscanf的用法
- redo日志写入为什么“俩阶段提交”
- wait()和sleep()
- java拦截器_Java工程师年底跳槽高潮即将到来,斩获满意offer的必备技巧(二)