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加入心跳包防止自动断开连接相关推荐

  1. java websocket心跳包_给websocket加入心跳包防止自动断开连接

    reconnect(url) { if(lockReconnect) return; lockReconnect = true; setTimeout(function () { //没连接上会一直重 ...

  2. 阿里云轻量应用服务器闲置时间过长自动断开连接

    问题描述 阿里云轻量应用服务器闲置时间过长自动断开连接,并且如果在本地使用远程连接工具,打开多个窗口,一段时间误操作,会进入卡死状态,就是输入任何命令都没有任何反应,导致工作效率严重低下. 解决方案 ...

  3. 云服务器自动断开连接的解决办法

    使用smarTTY连接腾讯云服务器一会不用就会自动断开连接,解决方法如下: 1. 找到sshd_config配置文件 vi /etc/ssh/sshd_config 使用vi打开进行编辑,在文件中找到 ...

  4. 腾讯云服务器自动断开连接的解决办法

    腾讯云服务器自动断开连接的解决办法 1.找到sshd_config配置文件 打开并进行编辑,输入命令: vim /etc/ssh/sshd_config 在此文件中找到以下配置项: # ClientA ...

  5. Linux的SSH登录超时自动断开连接设置

    关于ssh登录超时断开连接的设置有两个方面可以设置 1.修改sshd服务的配置文件sshd_config的内容 #ClientAliveInterval 0   指定了服务器向客户端请求消息的时间间隔 ...

  6. dbcp连接mysql,8小时会自动断开连接

    为什么80%的码农都做不了架构师?>>>    最近自己做一个项目用到dbcp连接mysql,开始时很正常,可是第二天再访问服务时就出问题了,mysql连接关闭了. mysql在空闲 ...

  7. oracle多久断开连接,Oracle自动断开连接

    ORACLE自动断开数据库连接解决办法 最近,有客户提出在系统的应用中出现数据库频繁自动断开连接(每10分钟)的异常现象,通过查找学习,找到如下两种解决方法.供大家参考. 方法一.直接修改资源配置文件 ...

  8. win7怎么连接不上宽带连接服务器未响应,win7宽带自动断开连接怎么办 win7宽带连接不上的快速解决方法...

    近日很多使用wn7系统的用户出现宽带自动断开连接的情况,大家知道该怎么解决吗?其实这种情况小编也遇到过,下面就为大家分享下小编遇到宽带自动断开连接的解决方法吧!大家如果没有其他的方法部分参照下面的步骤 ...

  9. 【SSH】SSH自动断开连接的原因和解决办法|SSH保持长连接方法

    目录 原因 解决方法 即看即用 方法1:手工修改 方法2:shell命令行修改 详细说明 REMOTE HOST IDENTIFICATION HAS CHANGED问题解决 原因 用putty/Se ...

最新文章

  1. xmlHttpRequest避免缓存的办法
  2. 基于TableStore的数据采集分析系统介绍
  3. win7如何取消计算机管理员权限,win7如何删除需要管理员权限的文件夹
  4. java实现word邮件合并,Aspose.Words控件操作实例—邮件合并功能概述
  5. Google DeepMind围棋程序AlphaGo的分析
  6. 中通知设置响铃_主动切断干扰源——手机“通知”精细化管理
  7. stata 线性回归分析基本操作
  8. 计算机图形学几何变换
  9. 深度解读智慧农业传感器及应用
  10. Mac安装Mysql(图文解说详细版)
  11. GeoDa 空间自相关操作步骤
  12. matlab2010安装详细图解案例
  13. 【Materials Studio学习七】构建石墨烯
  14. 使用Spring实现AOP的三种方式
  15. 使用Laravel提交POST请求出现The page has expired due to inactivity错误
  16. ios 内存深度优化_iOS内存优化
  17. Fruit Ripeness论文、代码和数据集汇总
  18. opera mini android apk,Download Opera Mini APK Android
  19. GPS差分——差分定位
  20. 02_平面转换 transform

热门文章

  1. Gradle增量编译(六)
  2. Paxos Made Simple 中文翻译
  3. lucene的数据类型
  4. flink event-time 和连续窗口的使用
  5. Leecode 869. 重新排序得到 2 的幂——Leecode每日一题系列
  6. 12行代码AC——L1-058 6翻了(15分)
  7. 应该掌握的神奇函数——sscanf的用法
  8. redo日志写入为什么“俩阶段提交”
  9. wait()和sleep()
  10. java拦截器_Java工程师年底跳槽高潮即将到来,斩获满意offer的必备技巧(二)