webSocket 前端 js 加入 心跳机制 的基本写法

1前言

websocket 一般 每隔 90 无操作则会自动断开  ,需要加入一个心跳机制 来防止 自断

2. 实验过程

(1)设定一个jsp 或html 文件都行 ,加入元素

(2)js 源码 ,点击查看

  1 //避免重复链接
  2 var lockReconnect = false;
  3 //路径
  4 var wsUrl = $("#wsUrl").val();
  5 console.log("路径" + wsUrl);
  6 //webSocket对象
  7 var ws;
  8 //时间间隔
  9 var tt;
 10
 11 if ("WebSocket" in window) {
 12     console.log("支持WebSocket")
 13 } else {
 14     alert("该浏览器不支持WebSocket")
 15 }
 16
 17 //创建ws连接
 18 var createWebSocket = function (wsUrl) {
 19     try {
 20         //成功
 21         ws = new WebSocket(wsUrl);
 22         webSocketInit();//初始化webSocket连接函数
 23     } catch (e) {
 24         //失败
 25         console.log(‘catch‘);
 26         //重连
 27         //重连函数
 28         webSocketReconnect(wsUrl);
 29     }
 30 };
 31 //初始化方法,成功后执行
 32 var webSocketInit = function () {
 33     //连接关闭函数
 34     ws.onclose = function () {
 35         console.log("连接已关闭...");
 36         webSocketReconnect(wsUrl)//如果连接关闭则重连
 37     };
 38     //连接错误函数
 39     ws.onerror = function () {
 40         console.log("连接错误...");
 41         webSocketReconnect(wsUrl)//如果连接错误则重连
 42     };
 43     //连接建立,发送信息
 44     ws.onopen = function () {
 45         var message1 = {
 46             "type": "SUB",
 47             "service": "业务1-确认第一次发送信息"
 48         };
 49         ws.send(JSON.stringify(message1));//webSocket业务订阅——可以有多个业务
 50         // var message2 = {
 51         //     "type": "SUB",
 52         //     "service": "业务2"
 53         // };
 54         // ws.send(JSON.stringify(message2));
 55         //心跳检测启动
 56         heartCheck.start();//订阅业务发送之后启动心跳检测机制
 57     };
 58     //业务订阅成功后接受服务端推送消息  ,其实是个字符串
 59     ws.onmessage = function (evt) {
 60         console.log(‘接收到消息‘ + evt.data);
 61         $("#span").html(evt.data);
 62         // var DATA=JSON.parse(evt.data);
 63         // if (DATA.service=="业务1") {
 64         //     console.log("接收业务1的数据");
 65         //     //接收业务1的数据,并进行相关逻辑处理
 66         // }
 67         // if (DATA.service=="业务2"){
 68         //     console.log("接收业务1的数据");
 69         //     //接收业务2的数据,并进行相关逻辑处理
 70         // }
 71         //接收一次后台推送的消息,即进行一次心跳检测重置
 72
 73         heartCheck.reset();
 74     };
 75
 76 };
 77
 78
 79 var webSocketReconnect = function (url) {
 80     console.log("socket 连接断开,正在尝试重新建立连接");
 81     if (lockReconnect) {
 82         return;
 83     }
 84     lockReconnect = true;
 85     //没连接上会一直重连,设置延迟,避免请求过多
 86
 87     //
 88     //s中清楚setTimeout的定时触发设置,之所以加个timer,是为了方便第二次赋值给timer。
 89     // 也就是说直接clearTImeout(timer)则timer就不存在了 再次访问就是error了。
 90     // 而timer&&clearTimeout(timer)则将timer 变成undefined
 91     tt && clearTimeout(tt);
 92     tt = setTimeout(function () {
 93        createWebSocket(url);
 94     }, 4000)
 95 };
 96
 97
 98 //心跳检测  .所谓的心跳检测,就是隔一段时间向服务器仅限一次数据访问,因为长时间不使用会导致ws自动断开,
 99 // 一般是间隔90秒内无操作会自动断开,因此,在间隔时间内进行一次数据访问,以防止ws断开即可,
100 //这里选择30秒,倒计时30秒内无操作则进行一次访问,有操作则重置计时器
101 //
102 //封装为键值对的形式,成为js对象,与json很相似
103 var heartCheck={
104     timeout: 30000,//30秒
105     timeoutObj: null,
106     reset: function(){//接收成功一次推送,就将心跳检测的倒计时重置为30秒
107         clearTimeout(this.timeoutObj);//重置倒计时
108         this.start();
109     },
110     start: function(){//启动心跳检测机制,设置倒计时30秒一次
111         this.timeoutObj = setTimeout(function(){
112             var message = {
113                 "type": "t10010",
114                 "service":"运行心跳业务一次 =="+ new Date()
115             };
116             // JSON.stringify()的作用是将 JavaScript 对象转换为 JSON 字符串
117             //而JSON.parse()可以将JSON字符串转为一个对象。
118             console.log("心跳一次");
119             ws.send(JSON.stringify(message));//启动心跳
120         },this.timeout)
121     }
122     //onopen连接上,就开始start及时,如果在定时时间范围内,onmessage获取到了服务端消息,
123     // 就重置reset倒计时,距离上次从后端获取消息30秒后,执行心跳检测,看是不是断了。
124 };
125
126 //开始创建webSocket连接
127 createWebSocket(wsUrl);
128 ///
129 function mysend() {
130     var text = $("#text").val();
131     console.log("text:" + text);
132     //向ws发送信息
133     ws.send(text);
134
135 }

(3)测试截图

3.心得

所谓的心跳检测,就是隔一段时间向服务器进行一次数据访问,因为长时间不使用会导致ws自动断开,一般是间隔90秒内无操作会自动断开,因此,在间隔时间内进行一次数据访问,以防止ws断开即可,这里选择30秒,倒计时30秒内无操作则进行一次访问,有操作则重置计时器

原文地址:https://www.cnblogs.com/c2g5201314/p/12304425.html

时间: 2024-10-10 16:24:57

webSocket 前端 js 加入 心跳机制 的基本写法的相关文章

websocket + node.js聊天系统

转:http://www.cnblogs.com/Wayou/p/hichat_built_with_nodejs_socket.html 前端一直是一块充满惊喜的土地,不仅是那些富有创造性的页面,还有那些惊赞的效果及不断推出的新技术.像node.js这样的后端开拓者直接将前端人员的能力扩大到了后端.瞬间就有了一统天下的感觉,来往穿梭于前后端之间代码敲得飞起,从此由前端晋升为'前后端'. 图片来自G+ 本文将使用Node.js加web socket协议打造一个网页即时聊天程序,取名为HiChat

面向Web Cloud的HTML5 App开发实战:Browser&HTML5&CSS3&PhoneGap&jQuery Mobile& WebSocket&Node.js(2天)

如何理解Android架构设计的初心并开发出搭载Android系统并且具备深度定制和软硬整合能力特色产品,是本课程解决的问题. 课程以Android的五大核心:HAL.Binder.Native Service.Android Service(并以AMS和WMS为例).View System为主轴,一次性彻底掌握Android的精髓. 之所以是开发Android产品的必修课,缘起于: 1,     HAL是Android Framework&Application与底层硬件整合的关键技术和必修技

面向Web Cloud的HTML5 App开发实战:Browser&HTML5&CSS3&PhoneGap&jQuery Mobile& WebSocket&Node.js(3天)

课程简介: 王家林老师(联系邮箱[email protected] 电话:18610086859 QQ:1740415547 微信号:18610086859) 22个HTML5主题一次性贯穿HTML5的一切技术: 一网打尽HTML5时代Device.(设备端).Browser(浏览器)和Cloud(浏览器)的所有技术: 以浏览器定制技术为基础,通晓HTML5+CSS3+PhoneGap+Web Socket +jQuery Mobile +Node.js等HTML5的六大核心技术: 最新研发的H

[Python]通过websocket与js客户端通信

网站大多使用HTTP协议通信,而HTTP是无连接的协议.只有客户端请求时,服务器端才能发出相应的应答,HTTP请求的包也比较大,如果只是很小的数据通信,开销过大.于是,我们可以使用websocket这个协议,用最小的开销实现面向连接的通信. 具体的websocket介绍可见http://zh.wikipedia.org/wiki/WebSocket 这里,介绍如何使用Python与前端js进行通信. websocket使用HTTP协议完成握手之后,不通过HTTP直接进行websocket通信.

前端Js传递数组至服务器端

相关学习资料 Linux黑客大曝光: 第8章 无线网络 无线网络安全攻防实战进阶 无线网络安全 黑客大曝光 第2版 http://zh.wikipedia.org/wiki/IEEE_802.11 http://www.hackingexposedwireless.com/doku.php http://blog.csdn.net/gueter/article/details/4812726 http://my.oschina.net/u/994235/blog/220586#OSC_h2_6

ajax下载,前端js下载(转)

前面一直做过下载的功能.就是后台将文件流写入response里面,然后就好了.前台会自动弹出下载提示等. 今天打算做一个ajax下载.想当然的结果死活浏览器没反应.我擦. 然后浏览器调试,发现response返回过来的是一串类似乱码的文本而不是二进制文件流.定位原因在这里. 之后继续百度,如何实现ajax异步下载.回答是这样的: 那就是请求方式有问题,文件下载的请求是不能写在ajax里面的! 原因:因为response原因,一般请求浏览器是会处理服务器输出的response,例如生成png.文件

Vue 浅谈前端js框架vue

Vue Vue近几年来特别的受关注,三年前的时候angularJS霸占前端JS框架市场很长时间,接着react框架横空出世,因为它有一个特性是虚拟DOM,从性能上碾轧angularJS,这个时候,vue1.0悄悄 的问世了,它的优雅,轻便也吸引了一部分用户,开始收到关注,16年中旬,VUE2.0问世,这个时候vue不管从性能上,还是从成本上都隐隐超过了react,火的一塌糊涂,这个时候,angular 开发团队也开发了angular2.0版本,并且更名为angular,吸收了react.vue的

宜信开源|UAV心跳机制与容器、进程数据采集

服务心跳机制主要用于确认服务的存活状态,UAVStack的心跳数据还负责上报节点的容器及进程监控数据,支持在前端实时查看应用容器和进程的运行状态,并根据这些数据对容器和进程做出预警. 一.背景 在微服务架构中,服务心跳是一个简单但非常重要的机制,用于确认微服务的存活状态.UAVStack中的心跳是一个Http请求,MonitorAgent(以下简称MA)通过定时向HealthManager(以下简称HM)发送一个带有特定报文格式的Http请求完成一次心跳的发送过程.心跳报文含有发送时的时间戳,用

golang+sse+angular的心跳机制、angullar的轮询机制、time.Duration和time.NewTicker的学习

长连接断开的原因 连接超时,浏览器自动断开连接 进程被杀死 不可抗拒因素 根据不同情况,高效保活的方式 连接超时:心跳机制 进程保活 断线重连 重点心跳机制 产物 心跳包 心跳应答 轮询与心跳区别 轮询一次相当于:建立一次TCP连接+断开连接 心跳:在已有的连接上进行保活 心跳设计要点 心跳包的规格(内容&大小) 心跳发送间隔时间(按照项目的特性进行判断) 断线重连机制(核心= 如何判断长连接的有效性) 心跳具体实现(基于sse的长连接) 客户端做心跳机制:客户端长时间没有反应,使用心跳机制,证