当前位置:首页 > 科技  > 软件

WebSocket:心跳检测与重连机制,你会吗?

来源: 责编: 时间:2023-12-11 09:27:44 319观看
导读为什么需要心跳检测?正常的情况客户端断开连接会向服务端发送一个fin包,服务端收到fin包后得知客户端连接断开,则立刻触发onClose事件回调。心跳包格式:WebSocket协议RFC6455中有定义控制帧的格式Ping帧包含一个操作码0x9

为什么需要心跳检测?

正常的情况客户端断开连接会向服务端发送一个fin包,服务端收到fin包后得知客户端连接断开,则立刻触发onClose事件回调。e9E28资讯网——每日最新资讯28at.com

心跳包格式:WebSocket协议RFC6455中有定义控制帧的格式Ping帧包含一个操作码0x9,Pong帧包含一个操作码0xA。客户端发送Ping帧,服务端收到Ping帧后回一个响应Pong帧。e9E28资讯网——每日最新资讯28at.com

但是有些极端情况如客户端掉电、网络关闭、拔网线、路由故障等,这些极端情况客户端无法发送fin包给服务端,服务端便无法知道连接已经断开。如果客户端与服务端定时有心跳数据传输,则会比较及时的发现连接断开,触发onClose事件回调。e9E28资讯网——每日最新资讯28at.com

另外路由节点防火墙会关闭长时间不通讯的socket连接,导致socket长连接断开。所以需要客户端与服务端定时发送心跳数据保持连接不被断开。e9E28资讯网——每日最新资讯28at.com

心跳原理

客户端定时每X秒(推荐小于60秒)向服务端发送特定数据(任意数据都可),服务端设定为X秒没有收到客户端心跳则认为客户端掉线,并关闭连接触发onClose回调。这样即通过心跳检测请求维持了连接(避免连接因长时间不活跃而被网关防火墙关闭),也能让服务端比较及时的知道客户端是否异常掉线。e9E28资讯网——每日最新资讯28at.com

心跳包机制

WebSocket心跳包机制WebSocket心跳包是WebSocket协议的保活机制,用于维持长连接。有效的心跳包可以防止长时间不通讯时,WebSocket自动断开连接。e9E28资讯网——每日最新资讯28at.com

心跳包是指在一定时间间隔内,WebSocket发送的空数据包。常见的WebSocket心跳包机制如下:e9E28资讯网——每日最新资讯28at.com

客户端

客户端定时向服务器发送心跳数据包,以保持长连接。e9E28资讯网——每日最新资讯28at.com

this.heartbeatTimer = setInterval(() => {    ws.send('{"event":"ping","content":"ping heartbeat"}');}, originData.ping_interval)
服务端

服务器定时向客户端发送心跳数据包,以检测客户端连接是否正常。e9E28资讯网——每日最新资讯28at.com

$gateway = new Gateway("websocket://0.0.0.0:8783");$gateway->pingInterval = 55;$gateway->pingNotResponseLimit = 0;// 服务端定时向客户端发送的数据$gateway->pingData = '{"type":"ping"}';

以上服务端会定时55秒给客户端发心跳数据{"type":"ping"},而客户端不需要定时向服务端发送心跳数据。e9E28资讯网——每日最新资讯28at.com

  • pingNotResponseLimit = 0代表服务端允许客户端不发送心跳,服务端不会因为客户端长时间没发送数据而断开连接。
  • pingNotResponseLimit = 1,则代表客户端必须定时发送数据给服务端,否则pingNotResponseLimit*pingInterval=55秒内没有任何数据发来则关闭对应连接,并触发onClose。

说明e9E28资讯网——每日最新资讯28at.com

  • Gateway::$pingInterval心跳检测时间间隔 单位:秒。如果设置为0代表不做任何心跳检测。
  • Gateway::$pingNotResponseLimit 客户端连续$pingNotResponseLimit次$pingInterval时间内不发送任何数据(包括但不限于心跳数据)则断开链接,并触发onClose。如果设置为0代表客户端不用发送心跳数据,即通过TCP层面检测连接的连通性(极端情况至少10分钟才能检测到连接断开,甚至可能永远检测不到)
  • Gateway::$pingData 当需要服务端定时给客户端发送心跳数据时, $gateway->pingData设置为服务端要发送的心跳请求数据,心跳数据是任意的,只要客户端能识别即可。客户端收到心跳数据可以忽略不做任何处理。

注意

当设置为服务端主动发送心跳时,心跳间隔并不是100%精准。当客户端连接成功后,服务端发来的第一个心跳的时间间隔可能要小于服务器设置的值。e9E28资讯网——每日最新资讯28at.com

当设置为服务端主动发送心跳时,如果客户端最近有发来数据,那么证明客户端存活,服务端会省略一个心跳,下个心跳大约1.5*$gateway->pingInterval秒后发送。e9E28资讯网——每日最新资讯28at.com

如果心跳是客户端发送,$gateway->pingNotResponseLimit最好大于0,这样可以及时检测到一些死连接(连接已经断开,但是服务端不知道)e9E28资讯网——每日最新资讯28at.com

心跳机制原理

WebSocket心跳机制的原理是利用心跳包及时发送和接收数据,保证WebSocket长连接不被断开。e9E28资讯网——每日最新资讯28at.com

WebSocket心跳机制的原理可以用下面的流程来说明:e9E28资讯网——每日最新资讯28at.com

  1. 客户端建立WebSocket连接。
  2. 客户端向服务器发送心跳数据包,服务器接收并返回一个表示接收到心跳数据包的响应。
  3. 当服务器没有及时接收到客户端发送的心跳数据包时,服务器会发送一个关闭连接的请求。
  4. 服务器定时向客户端发送心跳数据包,客户端接收并返回一个表示接收到心跳数据包的响应。
  5. 当客户端没有及时接收到服务器发送的心跳数据包时,客户端会重新连接WebSocket

心跳机制作用

  • 保持WebSocket连接不被断开。
  • 检测WebSocket连接状态,及时处理异常情况。
  • 减少WebSocket连接及服务器资源的消耗。

完整代码

服务端心跳(不推荐)

修改配置文件config/plugin/webman/gateway-worker/process.php进程配置文件。e9E28资讯网——每日最新资讯28at.com

'pingInterval' => 30,'pingNotResponseLimit' => 0,'pingData' => '{"event":"ping","msg":"我是服务端主动心跳检测"}',

控制台检测记录e9E28资讯网——每日最新资讯28at.com

图片图片e9E28资讯网——每日最新资讯28at.com

客户端心跳(推荐)
let $timeout = null;let ws = new WebSocket("ws://127.0.0.1:8783");ws.onopen = function(evt) {    let $_content = {        "event": "join",        "mode": 1,        "group_id": 0,        "from_user_id": "10086",        "from_username": "开源技术小栈",        "to_user_id": "10000",        "content": "加入会话",    };    ws.send(JSON.stringify($_content));};ws.onmessage = function(evt) {    console.log( "【开源技术小栈】接受消息: " + evt.data);    let _obj = JSON.parse(evt.data);    if (_obj.data.event === 'init') {        sendHeartbeat();    }};function sendHeartbeat() {    console.log('客户端定时发送心跳');    ws.send('{"event":"ping","content":"开源技术小栈我在线呢!"}');    $timeout = setTimeout(sendHeartbeat, 3000);}ws.onclose = function() {    clearTimeout($timeout);    console.log('没有网了,睡觉去了');};

控制台检测记录

图片图片e9E28资讯网——每日最新资讯28at.com

断线重连

不管是客户端发送心跳还是服务端发送心跳,连接都有断开的可能。例如浏览器最小化js被暂停、浏览器切换到其它tab页面js被暂停、电脑进入睡眠等等、移动端切换网络、信号变弱、手机黑屏、手机应用切换到后台、路由故障、业务主动断开等。尤其是外网环境复杂,很多路由节点会清理1分钟内不活跃的连接,这也是为什么心跳间隔推荐小于1分钟的原因。e9E28资讯网——每日最新资讯28at.com

连接在外网环境很容易被断开,所以断线重连是长连接应用必须具备的功能(断线重连只能客户端做,服务端无法实现)。例如浏览器websocket需要监听onclose事件,当发生onclose时建立新的连接(为避免需崩可延建立连接)。更严格一点,服务端也应该定时发起心跳数据,并且客户端需要定时监测服务端的心跳数据是否超时,超过规定时间未收到服务端心跳数据应该认定连接已经断开,需要执行close关闭连接,并重新建立新的连接。e9E28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-41704-0.htmlWebSocket:心跳检测与重连机制,你会吗?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 浅谈SPI机制之ServiceLoader的原理

下一篇: 史上最全的整合第三方授权登录的工具类库,JustAuth 搞定一切!

标签:
  • 热门焦点
  • K60至尊版刚预热 一加Ace2 Pro正面硬刚

    Redmi这边刚如火如荼的宣传了K60 Ultra的各种技术和硬件配置,作为竞品的一加也坐不住了。一加中国区总裁李杰发布了两条微博,表示在自家的一加Ace2上早就已经采用了和PixelWo
  • 俄罗斯:将审查iPhone等外国公司设备 保数据安全

    iPhone和特斯拉都属于在各自领域领头羊的品牌,推出的产品也也都是数一数二的,但对于一些国家而言,它们的产品可靠性和安全性还是在限制范围内。近日,俄罗斯联邦通信、信息技术
  • 6月iOS设备好评榜:第一蝉联榜首近一年

    作为安兔兔各种榜单里变化最小的那个,2023年6月的iOS好评榜和上个月相比没有任何排名上的变化,仅仅是部分设备好评率的下降,长年累月的用户评价和逐渐退出市场的老款机器让这
  • 容量越大越不坏?24万块硬盘故障率报告公布 这些产品零故障

    8月5日消息,云存储服务商Backblaze发布了最新的硬盘故障率报告,年故障率有所上升。Backblaze发布的硬盘季度统计数据,其中包括故障率等重要方面。这些结
  • K6:面向开发人员的现代负载测试工具

    K6 是一个开源负载测试工具,可以轻松编写、运行和分析性能测试。它建立在 Go 和 JavaScript 之上,它被设计为功能强大、可扩展且易于使用。k6 可用于测试各种应用程序,包括 Web
  • 自动化在DevOps中的力量:简化软件开发和交付

    自动化在DevOps中扮演着重要角色,它提升了DevOps的效能。通过自动化工具和方法,DevOps团队可以实现以下目标:消除手动和重复性任务。简化流程。在整个软件开发生命周期中实现更
  • 共享单车的故事讲到哪了?

    来源丨海克财经与共享充电宝相差不多,共享单车已很久没有被国内热点新闻关照到了。除了一再涨价和用户直呼用不起了。近日多家媒体再发报道称,成都、天津、郑州等地多个共享单
  • 英特尔Xe HPG游戏显卡:拥有512EU,单风扇版本

    据10 月 30 日外媒 TheVerge 消息报道,英特尔 Xe HPG Arc Alchemist 的正面实被曝光,不仅拥有 512 EU 版显卡,还拥有 128EU 的单风扇版本。另外,这款显卡 PCB
  • 北京:科技教育体验基地开始登记

      北京“科技馆之城”科技教育体验基地登记和认证工作日前启动。首批北京科技教育体验基地拟于2023年全国科普日期间挂牌,后续还将开展常态化登记。  北京科技教育体验基
Top