websocket心跳链接代码_WebSocket原理与实践(五)--心跳及重连机制
在使用websocket的过程中,有时候会遇到网络断开的情况,但是在网络断开的时候服务器端并没有触发onclose的事件。这样会有:服务器会继续向客户端发送多余的链接,并且这些数据还会丢失。所以就需要一种机制来检测客户端和服务端是否处于正常的链接状态。因此就有了websocket的心跳了。还有心跳,说明还活着,没有心跳说明已经挂掉了。
1. 为什么叫心跳包呢?
它就像心跳一样每隔固定的时间发一次,来告诉服务器,我还活着。
2. 心跳机制是?
心跳机制是每隔一段时间会向服务器发送一个数据包,告诉服务器自己还活着,同时客户端会确认服务器端是否还活着,如果还活着的话,就会回传一个数据包给客户端来确定服务器端也还活着,否则的话,有可能是网络断开连接了。需要重连~
那么需要怎么去实现它呢?如下所有代码:
WebSocket Demo//var ws = new WebSocket("wss://echo.websocket.org");
/*ws.onerror = function(e) {
console.log('已关闭');
};
ws.onopen = function(e) {
console.log('握手成功');
ws.send('123456789');
}
ws.onclose = function() {
console.log('已关闭');
}
ws.onmessage = function(e) {
console.log('收到消息');
console.log(e);
}*/
var lockReconnect = false;//避免重复连接
var wsUrl = "wss://echo.websocket.org";varws;vartt;functioncreateWebSocket() {try{
ws= newWebSocket(wsUrl);
init();
}catch(e) {
console.log('catch');
reconnect(wsUrl);
}
}functioninit() {
ws.onclose= function() {
console.log('链接关闭');
reconnect(wsUrl);
};
ws.οnerrοr= function() {
console.log('发生异常了');
reconnect(wsUrl);
};
ws.onopen= function() {//心跳检测重置
heartCheck.start();
};
ws.onmessage= function(event) {
//拿到任何消息都说明当前连接是正常的
console.log('接收到消息');
heartCheck.start();
}
}functionreconnect(url) {if(lockReconnect) {return;
};
lockReconnect= true;//没连接上会一直重连,设置延迟避免请求过多
tt &&clearTimeout(tt);
tt= setTimeout(function() {
createWebSocket(url);
lockReconnect= false;
},4000);
}//心跳检测
var heartCheck ={
timeout:3000,
timeoutObj:null,
serverTimeoutObj:null,
start:function(){
console.log('start');var self = this;this.timeoutObj && clearTimeout(this.timeoutObj);this.serverTimeoutObj && clearTimeout(this.serverTimeoutObj);this.timeoutObj = setTimeout(function(){//这里发送一个心跳,后端收到后,返回一个心跳消息,
console.log('55555');
ws.send("123456789");
self.serverTimeoutObj= setTimeout(function() {
console.log(111);
console.log(ws);
ws.close();//createWebSocket();
}, self.timeout);
},this.timeout)
}
}
createWebSocket(wsUrl);
具体的思路如下:
1. 第一步页面初始化,先调用createWebSocket函数,目的是创建一个websocket的方法:new WebSocket(wsUrl);因此封装成函数内如下代码:
functioncreateWebSocket() {try{
ws= newWebSocket(wsUrl);
init();
}catch(e) {
console.log('catch');
reconnect(wsUrl);
}
}
2. 第二步调用init方法,该方法内把一些监听事件封装如下:
functioninit() {
ws.onclose= function() {
console.log('链接关闭');
reconnect(wsUrl);
};
ws.οnerrοr= function() {
console.log('发生异常了');
reconnect(wsUrl);
};
ws.onopen= function() {//心跳检测重置
heartCheck.start();
};
ws.onmessage= function(event) {
//拿到任何消息都说明当前连接是正常的
console.log('接收到消息');
heartCheck.start();
}
}
3. 如上第二步,当网络断开的时候,会先调用onerror,onclose事件可以监听到,会调用reconnect方法进行重连操作。正常的情况下,是先调用
onopen方法的,当接收到数据时,会被onmessage事件监听到。
4. 重连操作 reconnect代码如下:
var lockReconnect = false;//避免重复连接
functionreconnect(url) {if(lockReconnect) {return;
};
lockReconnect= true;//没连接上会一直重连,设置延迟避免请求过多
tt &&clearTimeout(tt);
tt= setTimeout(function() {
createWebSocket(url);
lockReconnect= false;
},4000);
}
如上代码,如果网络断开的话,会执行reconnect方法,使用了一个定时器,4秒后会重新创建一个新的websocket链接,重新调用createWebSocket函数,
重新会执行及发送数据给服务器端。
5. 最后一步就是实现心跳检测的代码:如下:
//心跳检测
var heartCheck ={
timeout:3000,
timeoutObj:null,
serverTimeoutObj:null,
start:function(){
console.log('start');var self = this;this.timeoutObj && clearTimeout(this.timeoutObj);this.serverTimeoutObj && clearTimeout(this.serverTimeoutObj);this.timeoutObj = setTimeout(function(){//这里发送一个心跳,后端收到后,返回一个心跳消息,
//onmessage拿到返回的心跳就说明连接正常
console.log('55555');
ws.send("123456789");
self.serverTimeoutObj= setTimeout(function() {
console.log(111);
console.log(ws);
ws.close();//createWebSocket();
}, self.timeout);
},this.timeout)
}
}
实现心跳检测的思路是:每隔一段固定的时间,向服务器端发送一个ping数据,如果在正常的情况下,服务器会返回一个pong给客户端,如果客户端通过
onmessage事件能监听到的话,说明请求正常,这里我们使用了一个定时器,每隔3秒的情况下,如果是网络断开的情况下,在指定的时间内服务器端并没有返回心跳响应消息,因此服务器端断开了,因此这个时候我们使用ws.close关闭连接,在一段时间后(在不同的浏览器下,时间是不一样的,firefox响应更快),
可以通过 onclose事件监听到。因此在onclose事件内,我们可以调用 reconnect事件进行重连操作。
相关文章:

【转载】Asp.Net 全生命周期
用三张图片详解Asp.Net 全生命周期 此文是转载阳阳多的博客内容,特此声明。 下面我们使用三张图片解析ASP.net的整个生命周期,我总感觉使用图片更加的清楚的说明这种问题,所以使用的这样方式 说明: 1 第一张图片从全局说明从客户…

Context-Based Access Control (CBAC) 基于上下文的访问控制 理论知识
CBAC即基于上下文的访问控制协议,通过检查防火墙的流量来发现管理TCP和UDP的会话状态信息。这些状态信息被用来在防火墙访问列表创建临时通道。通过在流量一个方向上配置ip inspect列表,放行其返回流量。被允许会话是指来源于受保护的内部网络会话。它不…

week6 10 后端backend server和mongoDB通信
0 之前我们maogoDB用的是在线的mlab 在线他们帮我们做好了model 也就是那个schma 其实python也有类似的包 帮我们定义这些model 但是呢 我们自己来做吧 用一个传统的意义上mongoDB 就是 insert select来操作数据库 就是在不用其他类库 定义的model 我们如何操作数据库 我们这次…

Linux网络端口
Linux下端口个数 首先简单介绍一下Linux下的端口的函数,当Linux各个主机之间进行通信的时候我们需要将某些数据进程传输,这个时候就需要将数据传入到某一个特定 的主机,这个时候就使用了TCP/IP协议,IP地址是用来标识互联网的唯一…

汉字书写解码_《汉字解码学》 第一部分
《汉字解码学》第一部份汉字与世界密码文字的关系文字是人类语言的书写符号,是人类用来进行传递信息以便进行交流的可见符号系统。文字是人类文明的标识和产物。我们的祖先是如何来到中国的?世界科学研究关于人类基因的研究的最新成果表明:世…

WCF中服务继承多个契约的使用
服务继承多个契约其实也就是服务类实现了多个接口,主要是在配置中需要添加多个endpoint,各个endpoint之间的address不同、contract不同 契约: [html] view plaincopyprint?[ServiceContract] public interface IReportService { [Ope…

Pentaho平台上加仪表盘插件步骤
Pentaho平台上加仪表盘插件步骤 下面我将最近学习的在Pentaho平台上加仪表盘插件的步骤稍微整理了一下,希望对有需要的朋友有些帮助。 1. 解压插件包:cdf-de_0.2.tar.bz2(这个插件压缩包我即将上传) ,得到cdf- de_0.2 …

2018.09.01 poj3071Football(概率dp+二进制找规律)
传送门 概率dp简单题。 设f[i][j]表示前i轮j获胜的概率。 如果j,k能够刚好在第i轮相遇,找规律可以发现j,k满足: (j−1)>>(i−1)(j−1)>>(i−1)^1(k−1)>>(i−1)1(k−1)>>(i−1)。 简单举个例子? 假设有八个人&a…
循环冗余检验CRC
CRC简介 循环冗余校验(Cyclic Redundancy Check, CRC)是一种根据网络数据包或电脑文件等数据产生简短固定位数校验码的一种散列函数,主要用来检测或校验数据传输或者保存后可能出现的错误。它是利用除法及余数的原理来作错误侦测的。 在数据传输过程中,…

弹性碰撞后速度方向_$1.1.1 弹性碰撞经典例题1——力学及运动学
[ph1] 质量为2m的木块放置于质量为m的长木板上,木块与模板之间的动摩擦系数为 μ ,木板与地面的摩擦忽略不计。木块和木板以速度V0向右运动,在右侧足够远处有刚性墙壁,木块与墙壁发生完全弹性碰撞后向左运动,木板有足够…

一个简单实用的,基于EF的三层架构
到底什么样的框架才是好框架呢?或许不同人有不同的看法.我个人觉一个好的框架,最重要的要是简单实用,能快速适开发,可维护性高(不会出现复制黏贴的代码),并能快速响应各种业务场景的变化的框架,同时性能不会太差.我觉的这样的框架,就是一个好的框架.而且,我觉的做框架,千万不能…

转:中国互联网十五年的22个创新模式
中国互联网十五年的22个创新模式 今天,看网上有人推荐《沸腾十五年》,讲中国互联网从发源到现今。 有人有如此梳理,自己本来也想梳理一下中国互联网这么多年,到底是哪些公司出来了,为什么会是他们出来了。他们的…

2018 蓝桥杯省赛 B 组模拟赛(一)-年龄
今天蒜头君带着花椰妹和朋友们一起聚会,当朋友们问起年龄的时候,蒜头君打了一个哑谜(毕竟年龄是女孩子的隐私)说:“我的年龄是花椰妹年龄个位数和十位数之和的二倍”。 花椰妹看大家一脸懵逼,就知道大家也不…

C#中用ILMerge将所有引用的DLL和exe文件打成一个exe文件
今天做了一个软件,想发布的时候才发现调用的类没几个,就像把它们都跟EXE文件打包在一起,以后复制去别的地方用也方便,于是上网搜了一下,发现网上大部分都是用ILMerge实现的,于是也自己试了一下,不过网上都没有详细的步骤演示,我就花点时间做了个教程,方便以后再有人想打包自己的…

IPC--消息队列
消息队列的特点 消息队列是生命周期是随进程的,同时消息队列可以实现的是消息的传递方向是双向的。接受者和发送者时通过发送一个数据块来进性消息传递的,每个消息的数据类型不一样依次来进行区分我们该取哪个数据。消息队列是基于消息的,并…

sqlinesdata教程_如何将Oracle数据导入MySQL
Manager进程:需要源端跟目标端同时运行,主要作用是监控管理其它进程,报告错误,分配及清理数据存储空间,发布阈值报告等Extract进程:运行在数据库源端,主要用于捕获数据的变化,负责全…

关于PHP.ini文件的设定
php.ini文件中记录了php的配置,因此正确读取此配置文件对于php的部署实施很重要。 windows平台中,有2种常用的方法。 第一种方法:把php.ini复制到c:\windows目录中。 第二种方法:配置apache服务器,在..\Apache Softwar…

PAT (Advanced Level) 1132~1135:1132 模拟 1133模拟(易超时!) 1134图 1135红黑树
1132 Cut Integer(20 分) 题意:将一个含K(K为偶数)个数字的整数Z割分为A和B两部分,若Z能被A*B整除,则输出Yes,否则输出No。 分析:当A*B为0的时候,不能被Z整除…

poj 1523(无向联通图的割点)
结合tarjan算法思想,这题终于写了出来。 同样用dfs将图变成为一颗树,这样可以提供许多有用的性质。 对于一个无向连通图,dfs后的树为只有回边(回边Euv,v是u的祖先)和生成树的边的图。 那么在遍历到一个点u的时候&#…

IPC--信号量
信号量概念理解 信号量本质上 是一个计数器,用来统计临界资源申请资源的个数。其中的二元信号量的 值是0或者是1,即是要么是有,要么是无。信号量本身也是临界资源,所以一定要保证其原子性。信号量的工作原理:两个进程…

7 自动开启网卡_淘汰的旧手机别扔掉,这样设置变身4G上网卡
很多人都用过usb无线上网卡,把手机SIM卡插到上网的卡槽内,然后把usb上网卡插到电脑usb口,电脑安装好驱动程序后,即可畅游网络世界。当初3G上网卡价格不菲,随着更新换代4G快要过去,5G开始试商用,…

Struts2 的stream result用法
2019独角兽企业重金招聘Python工程师标准>>> <action name"download" class"com.unmi.action.DownloadAction"> <result name"success" type"stream"><!--type 为 stream 应用 StreamResult 处理-->…

Largest Rectangle in a Histogram
ps:单调栈,注意红色部分的代码。 int n;stack<P> s;inline void upd(LL &x, LL y) { (x < y) && (x y); }int main() {while(sc(n) ! EOF && n) {while(!s.empty()) s.pop();LL ans 0;Rep(i, 1, n) {int x;sc(x);if (s.e…

IPC--共享内存
有了之前的学习经验,共享内存对我们学习起来相对简单一些了,这里简单说说共享内存的一些,然后对于函数的分析直接在代码里面的注释部分有说明,如果还是不懂,可以先看看前面的关于IPC–信号量还有IPC–消息队列的讲解 …

2020年行政区划代码_2020年柳州市行政区划,了解柳州市有几个区,详细数据
本文通过整理了柳州市行政区划代码数据及柳州市统计用的城乡划分代码,带你了解柳州市有几个区、县及下面的街道和镇划分详细情况。柳州市有几个区、县、县级市?答:柳州市有5个区、5个县(行政区划2020年7月)。分别为:城中区、鱼峰区…

sql2000 转sql2008
1,在sql2008服务器上新建空数据库,与sql2000同名,当然可以不同名。 2,在sql2008服务器上选择数据库,点右键,任务-导入数据。打开导入数据向导。 3,点击下一步,选择数据源。数据源可以…

linux下查看网卡型号
查看网卡型号[rootcentos /]# lspci | grep Ethernet02:01.0 Ethernet controller: Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE] (rev 10)我这里型号是79c970,驱动pcnet32.查看驱动信息[rootcentos /]# modinfo pcnet32filename: /lib/modules/2.6.18-194.el5/…

linux_域名映射
vi /etc/hosts在最后加上ip及映射的域名192.168.229.111 node001192.168.229.112 node002192.168.229.113 node003 转载于:https://www.cnblogs.com/lxyuuuuu/p/9578659.html
地址解析协议ARP
设计需求 ARP协议解决的问题就是:在同一个局域网中,解决主机IP地址和硬件地址的映射问题 基本使用原理 当数据在网络中某一条链路传输的时候我们知道目的主机的IP地址,但是不知道硬件地址,ARP协议就是解决这个问题的一个协议&a…

ie8加载js太慢_js ie8 慢
Re请教ap6214f2r版主一些问题引用第2楼ap6214f2r于2012-09-10 14:08发表的 :楼主,关于你说的慢,我去看了下你网站响应速度非常快[attachment26863]这个请求是计算签名,跳转到OSS的。.......老大,我刚才试了一下,不是线…