websocket以及心跳机制的实现

websocket心跳的实现(包括全部代码) 本文主要讲的是如果设计websocket心跳已经需要考虑哪些问题。前言在使用websocket的过程中,有时候会遇到客户端网络关闭的情况,而这时候在服务端并没有触发onclose事件。这样会: 多余的连接 服务端会继续给客户端发数据,这些数据会丢失 所以就需要一种机制来检测客户端和服务端是否处于正常连接的状态。这就是websocket心跳,这个名字非常生动形象,还有心跳说明还活着(保持正常连接),没 阅读详情

#为什么要使用websocket

        在浏览器与服务器通信之间,传统的http请求在某些场景下并不理想,比如实时聊天,实时性的小游戏等等,

其中面临主要的两个缺点:

  • 无法做到消息的实时性

  • 服务器无法主动推送信息

其基于http的主要解决方案有:

  • 基于ajax的轮询:客户端定时或者动态相隔短时间内不断向服务器请求接口,询问服务器是否有新信息;其缺点也很明显;多余的空请求(浪费资源)、数据获取有延时;

  • Long poll(长轮询):其中采用的是阻塞性的方案,客户端向服务器发起ajax请求,服务器挂起该请求不返回数据直接有新的数据,客户端接收到数据之后再次执行long poll;该方案中每个请求都挂起了服务器,在大量连接的场景下是不可以接收的

可以看到,基于 HTTP 协议的方案都包含一个本质缺陷 —— 「被动性」,服务端无法下推消息,仅能由客户端发起请求不断询问是否有新的消息,同时对于客户端与服务端都存在性能消耗。

WebSocket 是 HTML5 开始提供的一种浏览器与服务器间进行全双工通讯的网络技术。 WebSocket 通信协议于2011年被IETF定为标准RFC 6455,WebSocketAPI 被 W3C 定为标准。 在 WebSocket API 中,浏览器和服务器只需要要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。

WebSocket 是 HTML5 中提出的新的网络协议标准,其包含几个特点:

  • 建立于 TCP 协议之上的应用层;

  • 一旦建立连接(直到断开或者出错),服务端与客户端握手后则一直保持连接状态,是持久化连接;

  • 服务端可通过实时通道主动下发消息;

  • 数据接收的「实时性(相对)」与「时序性」;

  • 较少的控制开销。连接创建后,ws客户端、服务端进行数据交换时,协议控制的数据包头部较小。在不包含头部的情况下,服务端到客户端的包头只有2~10字节(取决于数据包长度),客户端到服务端的的话,需要加上额外的4字节的掩码。而HTTP协议每次通信都需要携带完整的头部。

  • 支持扩展。ws协议定义了扩展,用户可以扩展协议,或者实现自定义的子协议。(比如支持自定义压缩算法等)

  # 为什么要使用心跳机制呢

        遇到的问题:

                实时聊天过程中,

  1.  websocket连接后,长时间远端和客户端不发消息,服务端会把websocket给断开;
  2. 所以就需要一种机制来检测客户端和服务端是否处于正常的链接状态。
  3. 因此就有了websocket的‘心跳监测’。
  4. 还有心跳,说明还活着,没有心跳说明已经断开了。

        关于websocket的心跳重连机制

  1. 心跳机制是每隔一段时间会向服务器发送一个数据包:

    告诉服务器(后台)自己还活着,同时客户端(浏览器)会 确认服务器端是否还活着

  2. 如果还活着的话,就会回传一个数据包给客户端
  3. 服务端断开连接了。客户端需要重连~

webscoket导致的兼容问题 可以用短轮询和长轮询代替,对浏览器的版本兼容性考虑

        判断浏览器的版本,可以使用navigator对象的userAgent属性来获取浏览器的信息。userAgent属性返回一个字符串,其中包含了浏览器的版本信息。

    那么如何进行判断呢

        以下就是个案例

let browser = ""; // 存储浏览器名称

// 判断浏览器类型
if (userAgent.indexOf("msie") > -1 || userAgent.indexOf("trident") > -1) {
  browser = "IE";
} else if (userAgent.indexOf("firefox") > -1) {
  browser = "Firefox";
} else if (userAgent.indexOf("chrome") > -1 && userAgent.indexOf("edge") === -1) {
  browser = "Chrome";
} else if (userAgent.indexOf("safari") > -1 && userAgent.indexOf("chrome") === -1) {
  browser = "Safari";
} else if (userAgent.indexOf("edge") > -1) {
  browser = "Edge";
}

// 判断浏览器版本
let version;
switch (browser) {
  case "IE":
    version = userAgent.match(/(?:msie|rv:)\s?([\d.]+)/)[1]; // 匹配IE浏览器的版本
    break;
  case "Firefox":
    version = userAgent.match(/firefox\/([\d.]+)/)[1]; // 匹配Firefox浏览器的版本
    break;
  case "Chrome":
    version = userAgent.match(/chrome\/([\d.]+)/)[1]; // 匹配Chrome浏览器的版本
    break;
  case "Safari":
    version = userAgent.match(/version\/([\d.]+)/)[1]; // 匹配Safari浏览器的版本
    break;
  case "Edge":
    version = userAgent.match(/edge\/([\d.]+)/)[1]; // 匹配Edge浏览器的版本
    break;
}

// 进行兼容性判断
if (browser === "IE" && version < 10) {
  // IE浏览器版本低于10
  alert("您当前使用的浏览器版本过低,请升级!");
} else {
  // 执行其他操作
  console.log(`当前浏览器为${browser},版本号为${version}`);
}
短轮询

        短轮询是通过HTTP请求来获取服务器数据,通常是固定的时间间隔发送请求,比如每隔5秒发送一次请求获取最新数据。在Vue3中,我们可以通过使用axios库来实现短轮询,代码如下:

export default {
  data() {
    return {
      data: []
    }
  },
  mounted() {
    this.interval = setInterval(() => {
      axios.get('/api/getData').then(res => {
        this.data = res.data
      })
    }, 5000)
  },
  beforeUnmount() {
    clearInterval(this.interval)
  }
}
长轮询  

长轮询是通过HTTP请求来获取服务器数据,但该请求会一直保持连接状态,直到服务器端有数据更新或者超时才会返回数据。在Vue3中,我们可以通过使用axios库实现长轮询,代码如下:

export default {
  data() {
    return {
      data: []
    }
  },
  async mounted() {
    while (true) {
      try {
        const res = await axios.get('/api/getData', {
          timeout: 60000 // 设置超时时间
        })
        this.data = res.data
      } catch (err) {
        console.error(err)
      }
    }
  }
}

这里通过使用while循环来保持连接状态,使用axios库发送get请求获取最新数据。在请求失败或超时后进行异常处理,可以避免程序崩溃。需要注意的是,长轮询需要设置超时时间,否则可能会导致资源耗尽。

WebSocket开发(心跳监测)功能 在之前的文章中完成了客服对话的Demo功能,但是现在的连接是无限制的长时间连接没有做心跳、失活、超时断连等功能,心跳的实现方法有很多种,并且WebSocket就提供了ping/pong类型的消息。如果是前端发送心跳,后端需要返回心跳,也就是ping pong的过程会有两次数据传递。后端来发送心跳的话,就只需要发送ping,前端不需要回应。这两种后续的处理方式也有各自优缺点。客户端触发:优点灵活控制无需设置主动超时逻辑清晰服务端简单缺点两次消息传递消息内容容易篡改服务端触发:优点节省宽带。... 阅读详情

相关推荐

实现websocket心跳检测,断线重连机制

WebSocket是一种革命性的,构建在TCP之上,旨在简化客户端与服务器之间的数据交换过程。通过单次握手建立持久连接,WebSocket实现了真正的双向实时通信,显著提高了交互效率。这一特性使其成为开发实时应用的理想选择,特别适用于等场景。相较于传统HTTP轮询方式,WebSocket不仅降低了网络带宽消耗,还大幅提升了数据传输速度和实时性,为现代Web应用提供了更加高效可靠的通信解决方案。WebSocket连接的生命周期包括三个关键阶段:建立、数据传输和关闭。

2401_86544677的博客 6313

WebSocket服务端数据推送及心跳机制(Spring Boot + VUE)

HTML5规范在传统的web交互基础上为我们带来了众多的新特性,随着web技术被广泛用于web APP的开发,这些新特性得以推广和使用,而websocket作为一种新的web通信技术具有巨大意义。WebSocket是HTML5新增的协议,它的目的是在浏览器和服务器之间建立一个不受限的双向通信的通道,比如说,服务器可以在任意时刻发送消息给浏览器。支持双向通信。

askuld的博客 8727

webSocket前端开发实现+心跳检测机制

最近项目用到了webSocket实时通信机制,将过程中遇到的麻烦和坑做一下记录 首先,了解一下webSocket是什么?它是一种网络通信协议,是HTML5开始提供的一种在单个TCP连接上进行全双工通讯的协议。 为什么要使用webSocket以及心跳检测机制 网上当然后很多讲解,这是本人的一个简单理解: 一般情况下前后端通信会采用HTTP网络协议,它是一种无状态的、无连接的、单向的应用层协议,采用请...

mayuan2011的博客 1万+

jQuery建立WebSocket连接

jQuery建立WebSocket连接,向服务端发送数据,实现WebSocket连接成功。向服务端发送消息,服务端返回数据,接收数据。

qq_42217708的博客 6321

WebSocket心跳机制设计与实现详解

WebSocket作为HTML5提供的全双工通信协议,在现代Web应用中扮演着重要角色。心跳机制是保障WebSocket连接稳定性的关键技术,通过定期发送小型探测报文(心跳包)来保持连接活跃并检测连接健康状况。其核心原理包括双向确认、状态管理和指数退避算法等。在金融交易、在线协作等实时性要求高的场景中,合理的心跳设计能显著提升用户体验。本文深入探讨Ping-Pong双向确认、心跳重置策略等实现细节,并分享生产环境中的参数调优和监控方案,帮助开发者构建更可靠的实时通信系统。

weixin_34094282的博客 444

通过前端Jquery调用web Socket连接,并返回数据Demo

通过前端Jquery调用Web Socket服务连接,并返回数据,记得在websocket.demo.js中修改你自己的websocket连接

Socket.io 实现 WebSocket 的心跳机制

现代的 Web 应用越来越复杂,往往需要实时通信来保持用户体验。WebSocket 技术是一种实现实时通信的标准,但是它存在连接断开、网络延迟等问题,这就需要一个称之为“心跳机制”的解决方案,以保持 WebSocket 的稳定通信。本篇文章将介绍 Socket.io 实现 WebSocket 心跳机制的方法。本篇文章介绍了 Socket.io 实现 WebSocket 心跳机制的方法,并提供了相应的示例代码和详细的解释。同时,我们也了解了心跳机制的作用和实现的原理。

2401_84695014的博客 2203

HALCON深度学习模型部署新选择:一份详细的OpenVINO 2021.4 LTS集成与配置避坑指南

本文详细介绍了如何将HALCON深度学习模型与OpenVINO 2021.4 LTS集成,提供环境配置、硬件加速优化及故障排除的实用指南。特别针对Intel独立显卡的AI加速器接口进行优化,帮助机器视觉工程师提升AI推理效率,适用于工业检测等高要求场景。

weixin_42531779的博客 238

SpringBoot实现WebSocket心跳机制

SpringBoot实现WebSocket心跳检测,检测数据写入CSV文件

qq_35019521的博客 7994

WSL2 Ubuntu复现FoundationPose项目(docker)

复现一个基于深度学习的物体姿态估计框架FoundationPose项目,使用docker,WSL2

woaidawangwang的博客 2000

56-FMC连接器电路设计

FMC连接器电路设计

weixin_66510961的博客 4723

简单实现webSocket + 心跳机制

import { baseUrl } from "../assets/js/baseUrl"; class WS { ws: any | null = null; timeOut: number = 5000; timer: any = null; serverTimer: any = null; connect() { this.ws = new WebSocket...

weixin_43660626的博客 554

C51红外接收与发射控制及原理编码与解码

基于38khz的NEC协议红外发射简易电路图NEC协议产生红外光数据编码 0 1结合程序红外接收接收电路解码过程解码代码 红外发射 通过通过红外二极管发射红外光,三极管的状态来控制。 红外模块一般都是三个引脚,vcc,gnd,dat,通过控制dat口的来控制发射红外光。 简易电路图 将数据口连接到单片机的引脚为上,控制io口的电平状态,来控制三极管的导通状态,从而发射红外光。 NEC协议 NEC协议特点:8位地址和8位命令为提高可靠性,地址和命令都传输2次,脉冲间隔调制38kHz载波频率。 包含引导码,

yangfeng20的博客 1万+

WebSocket心跳机制实现要点

WebSocket心跳机制通过定期通信保持连接活跃,防止超时断开。

2301_81137804的博客 1030

扫地机器人:从仿真到决策,一个完整SLAM导航系统的自研之路

本文详细记录了从零开始自研扫地机器人SLAM导航系统的全过程,涵盖ROS-Gazebo仿真系统搭建、地图预处理优化、全覆盖规划算法迭代等关键技术。通过三次算法升级,最终实现92%的清洁效率,并分享DWA调参、状态机设计等实战经验,为开发者提供从仿真到落地的完整解决方案。

weixin_29053695的博客 352

高分辨率航拍图像的目标检测切图优化策略

本文深入探讨了高分辨率航拍图像目标检测中的切图优化策略。针对大尺寸图像直接缩放导致小目标信息丢失的问题,文章详细阐述了基于重叠切割的核心方法,包括如何根据目标尺寸确定切图尺寸与重叠率,并提供了从切图到坐标还原的完整代码实现与避坑指南,有效提升检测精度与效率。

xk7n92h3p5m的博客 1113

WebSocket心跳机制实现与问题排查

当WebSocket连接建立后,客户端会向服务器发送心跳消息,服务器在收到心跳消息后进行确认回复,从而实现连接的存活性。WebSocket心跳机制是保障WebSocket连接持续性的关键机制之一,其实现需要考虑客户端和服务器端的需求和考虑因素。(2)检查服务器是否能够正常接收和处理心跳消息,可以通过设置合理的心跳间隔和阈值等方式进行优化。(2)发送心跳消息:在每次需要与服务器的交互时,客户端向服务器发送心跳消息。(b)对于可能出现的心跳失败的情况,设置合适的超时时间和其他异常处理机制。

2501_90410679的博客 353

使用ChatGPT工具阅读文献的实战教程

本文介绍核心内容为使用ChatGPT工具阅读文献,希望对学习和使用ChatGPT的同学们有所帮助。为了兼顾质量和速度,本专栏的更新频率为一周一到两更。 文章目录 1. 前言 2. 实战教程 2.1 下载工具并登录 2.2 提取文献中的关键信息

herosunly的博客 15万+

websocket连接以及心跳机制在vue下的实现

WebSocket 1.什么是webSocket webSocket协议是HTML5的一种通信协议,该协议兼容我们常用的浏览器。例如Chrome、Firefox、IE等。它可以使客户端和服务端双向数据传输更加简单快捷,并且在TCP连接进行一次握手后,就可以持久性连接,同时允许服务端对客户端推送数据。外加传统模式的协议一般HTTP请求可能会包含较长的头部,但真正有效的可能只有小部分,从而占用了很多资源和带宽。因此WebSocket协议不仅实时通讯,支持扩展;也可以压缩节省服务器资源和带宽。WS协议和WSS协议

RepecTT的博客 4606

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

java web 心跳机制实现,基于javax的websocket服务端实现,含心跳机制

websocket连接类package com.dnn.controller.inter;import java.io.IOException;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;import java.util.Set;import java.util.concurre...

weixin_31695145的博客 1009

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

理解WebSocket心跳及重连机制以及加强版的reconnectingwebsocket.js实现

理解WebSocket心跳及重连机制 在使用websocket的过程中,有时候会遇到网络断开的情况,但是在网络断开的时候服务器端并没有触发onclose的事件。这样会有:服务器会继续向客户端发送多余的链接,并且这些数据还会丢失。所以就需要一种机制来检测客户端和服务端是否处于正常的链接状态。因此就有了websocket的心跳了。还有心跳,说明还活着,没有心跳说明已经挂掉了。 1. 为什么叫心跳包呢? 它就像心跳一样每隔固定的时间发一次,来告诉服务器,我还活着。 2. 心跳机制是? 心跳机制是每隔..

liinux-Talk is cheap,show me the code. 6364

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

websocket的心跳机制及demo实现

1.描述: 1.WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。 2.WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。 2.websocket与http的区别: 当获取 Web Socket 连接后,可以通过 send() 方法来向服务器发送数据,并通过 onmessage 事件来接收

C05230的博客 1494

go websocket实现单聊群聊心跳机制

多开几个窗口改变userID,touser要发送给的用户id,msg消息内容。多开几个窗口改变userID,roomID是房间号,一个房间的可以聊天。alsark/go-websocket示例。

qq_42808312的博客 773

java websocket服务端实现,含心跳机制

websocket连接类 package com.dnn.controller.inter; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.Set; import java.util....

WXN的博客 8292

WebSocket心跳检测机制与实现优化

WebSocket作为现代实时通信的核心协议,其长连接特性在提升通信效率的同时,也带来了连接状态管理的挑战。心跳检测机制通过定期收发特定数据包来维持连接活跃性,是解决网络波动导致僵尸连接问题的关键技术。从技术原理看,心跳检测需要平衡检测间隔、超时阈值和异常处理策略,在在线教育、物联网等场景中尤为关键。通过动态调整算法和业务数据融合等优化手段,可以显著提升连接稳定性并降低带宽消耗。本文结合Node.js实践,详细解析了前端主导、服务端主导和混合协商三种典型心跳方案,并提供了生产环境中的性能调优指标和安全防护措

weixin_29207149的博客 362
上一篇: fouc是什么,如何解决fouc这个问题
下一篇: vue如何实现百万条数据以及数据的批量导出
.2021
博客等级 码龄4年 149粉丝 32原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值