WebSocket心跳机制

2023-11-02

WebSocket是HTML5开始提供的一种浏览器与服务器进行全双工通讯的网络技术,属于应用层协议。
WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。

1、创建webSocket

// Create WebSocket connection.
const socket = new WebSocket('ws://localhost:8080');

2、websocket事件

事件 事件处理程序 描述
open Socket.onopen 连接建立时触发
message Socket.onmessage 客户端接收服务端数据时触发
error Socket.onerror 通信发生错误时触发
close Socket.onclose

连接关闭时触发

3、WebSocket方法

方法 描述
Socket.send() 使用连接发送数据
Socket.close() 关闭连接

WebSocket的心跳机制

问题:

(1)websocket在连接后,如果长时间服务端和客户端不发消息,服务端会把websocket给断开。

(2)存在网络忽然断开的情况,这时服务器端并没有触发onclose的事件。服务器会继续向客户端发送多余的信息,这些数据会丢失。

心跳重连机制

为了解决上面的问题,就需要⼀种机制来检测客户端和服务端是否处于正常的连接状态。因此就有了websocket的心跳机制。

⼼跳机制是客户端每隔⼀段时间会向服务端发送⼀个数据包,告诉服务端自己还活着,同时客户端会根据服务端是否会回传⼀个数据包来确定服务端是否还活着。
如果客户端没有收到回复,表示websocket断开连接或者网络出现问题,就需要重连

const socket = new WebSocket('ws://localhost:8080'); // WebSocket 建立连接
const heartCheck = initHeartCheck();// 初始化心跳检测对象

// WebSocket建立连接成功
socket.addEventListener('open', function (event) {
  heartCheck.start();// 启动心跳检测
  socket.send('Hello Server!');
});
// WebSocket接受到服务端消息
socket.addEventListener('message',function(event){
  heartCheck.start();// 启动心跳检测
})
// WebSocket 连接被关闭
socket.addEventListener('close',function(event){
  heartCheck.reset();// 启动心跳检测
})
// WebSocket 连接因错误而关闭
socket.addEventListener('error',function(event){
  heartCheck.reset();// 启动心跳检测
})

function initHeartCheck() {
        return {
            timeout: 2 * 1000, // 每2s向服务端发送一次消息
            serverTimeout: 10 * 1000, // 10s收不到服务端消息算超时
            timer: null,
            serverTimer: null,
            reset() { // 心跳检测重置
                clearTimeout(this.timer);
                clearTimeout(this.serverTimer);
                this.timer = null;
                this.serverTimer = null;
                return this;
            },
            start() { // 心跳检测启动
                this.reset();
                this.timer = setTimeout(() => { 
                    socket.send('ping'); // 定时向服务端发送消息
                    if (!this.serverTimer) {
                        this.serverTimer = setTimeout(() => {
                            // 关闭连接触发重连
                           console.log(new Date().toLocaleString(), "not received pong, close the websocket");
                          socket.close(); //关闭websocket或根据业务需求去重连 
                        }, this.serverTimeout);
                    }
                }, this.timeout);
            },
        }
    }

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WebSocket心跳机制 的相关文章

  • 在 Web Worker 或 Service Worker 中运行 WebSocket - javascript

    我有来自不同站点的 9 个 websocket 连接 用于使用数据更新 DOM 目前 我正在连接所有网络套接字并监听所有网络套接字 并通过函数调用更新数据 我面临的问题是有很多 websocket 连接 并且存在内存和 CPU 使用问题 如
  • 我可以使用单个 websocket 服务器同时打开 2 个端口吗

    我是 websocket 编程的新手 目前我正在开发一个简单的 websocket 服务器 使用 c 可以响应 websocket 客户端 我设法在单个端口上使用 1 个客户端和 1 个服务器 我想知道是否可以打开 2 个端口 以便不同的客
  • WebSocket 库 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想在 Linux 上使用 C 访问 WebSocket API 我见过不同的图书馆 比如libweb
  • Play框架2.5.0 Websockets示例[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 播放框架 2 5 0 Websockets 示例 在 play 2 5 0 websockets 代码
  • 如何从普通请求调用(即@RequestMapping)调用@SendTo

    我已经使用 Spring MVC 实现了 Web Socket 它对我来说工作得很好 即从一个浏览器工作到另一个浏览器 该浏览器对使用此代码的套接字开放 MessageMapping hello SendTo topic greetings
  • 在cypress中捕获websocket请求

    我试图捕获测试期间发生的所有请求 我的应用程序使用 WebSocket 并且使用拦截命令我无法捕获 wss 请求 有什么办法可以做到这一点吗 我认为拦截命令不能直接捕获网络套接字 一种方法是观察 ws 通信的结果 如下所示使用 Cypres
  • 使用服务器发送事件进行双向客户端-服务器通信(而不是 WebSocket)的缺点

    最近 我发现服务器发送事件是 WebSocket 的一种更简单的替代方案 用于从服务器进行推送 大多数比较它们的地方 例如here https stackoverflow com questions 5195452 websockets v
  • iOS 中通过 USB 进行反向端口转发

    我在桌面上有一个 Web 套接字服务器 在 iPhone 设备上有一个客户端 我想使用 USB 而不是任何网络与他们通信 我已经使用 adb reverse 在 android 上实现了它 但无法找到适用于 iOS 的任何解决方案 我尝试使
  • 使用单个“proxyServer”将 Websocket 代理到多个目标

    我正在开发一个nodeJS websocket代理服务器 用例是当 websocket 请求到来时 我将检查其凭据 添加新标头 然后根据其组 来自用户 ID 将 websocket 连接重定向到其目标 webscoket 服务器 我发现大多
  • 如何等待 WebSocket 就绪状态更改

    我正在尝试实现一个可以回退到轮询的 WebSocket 如果WebSocket连接成功 readyState变为1 但如果失败 readyState是 3 我应该开始轮询 我尝试过这样的事情 var socket new WebSocket
  • React Native Android 无法连接到 WebSocket

    尽管 Web 实现可以工作 但 android 模拟器以及我的设备无法连接到 WebSocket 在引发错误的地方收到以下事件错误代码 然后断开连接 connection error Event isTrusted false messag
  • 通过 PHP 连接到 socket.io(nodejs)

    我需要通过 php 连接到 websocket 发送数据并立即断开连接 无需等待套接字的响应 我用了大象io http elephant io 但更新库后不起作用 请告诉我如何通过 PHP 连接到 websocket 我也遇到了这个问题 学
  • Dispatcher-servlet 无法映射到 websocket 请求

    我正在开发一个以Spring为主要框架的Java web应用程序 特别使用Spring core Spring mvc Spring security Spring data Spring websocket 像这样在 Spring 上下文
  • 当存在打开的 ASP.NET 4.5 Websocket 时,IIS 应用程序池无法回收

    我遇到了一个问题 可以通过以下方式复制 您需要 IIS8 因此必须在 Windows 8 或 Windows Server 2012 R2 上 在 IIS 管理器中创建一个新网站 例如在端口 8881 上的 TestWs 指向一个新文件夹
  • 如何将中间件绑定到socket.io中的事件

    现在您可以将中间件绑定到io use middleware 但这仅在建立套接字连接时触发 有没有办法在将其传递给事件句柄之前拦截它 就像在expressjs中一样 换句话说 In 快递 js你可以做 app get middleware1
  • 如何使用 POCO 发送 websocket PONG 响应

    我正在尝试使用 POCO 1 7 5 设置 websocket 服务器 POCO的样本发现here https github com pocoproject poco blob develop Net samples WebSocketSe
  • 在 MVC 控制器内打开 websocket 通道

    有没有人有在 MVC 控制器内打开 websocket 连接的良好经验 技术栈 ASPNET Core 1 0 RC1 MVC dnx46 System Net WebSockets 为什么使用 MVC 而不是中间件 为了整体一致性 路由
  • Symfony 2 GeniusesOfSymfony/WebSocketBundle

    我正在 symfony 2 应用程序中工作 我需要使用 websocket 我找到了一个名为 GeniusesOfSymfony WebSocketBundle 的包 并将其集成到系统中 该捆绑包基于 JDare ClankBundle 但
  • 有没有适用于 IE 的 websocket 插件?

    有没有适用于 IE 的插件 我可以在 IE 7 8 9 中使用 Websockets 我还没找到 socket io 使用的后备方案之一是 flash gimite web socket js https github com gimite
  • 使用 Google App Engine 向防火墙后面的设备发起消息

    我想使用 Google App Engine 向位于防火墙 路由器 NAT 后面的设备发起 http 流量 这些设备将接收来自 GAE 的命令 我可以让设备轮询 GAE 来查找新消息 但这会占用大量流量 或者 我可以尝试永久保持打开连接 但

随机推荐

  • VAN:Visual Attention Network

    Visual Attention Network Submitted on 20 Feb 2022 v1 last revised 11 Jul 2022 this version v5 Computer Vision and Patter
  • 微服务zipkin与turbine同时使用遇到的问题

    最近整合zipkin的时候遇到的问题 如果打开turbine监控时 每个turbine刷新周期内都会有rxjava的调用被zipkin捕获到 由于zipkin中的数据是通过Spring cloud sleuth上传的 查阅https clo
  • 数字化转型下数据库面临的12个挑战

    数字化及数字化转型 是近些年来非常火热的话题 本文将从这一角度切入 谈谈数字化场景下对数据库发展趋势带来的影响 1 数据 数字化 数字化转型 数据 是数字化实现的新引擎 数据是企业开展数字化创新和构建企业数字化基因的核心要素 通过对于服务对
  • React--井字棋小游戏

    安装较新版本的node js 这里使用的是v15 0 1 用以记录React学习笔记 1 搭建本地开发环境 在想要创建项目的文件夹下输入cmd 回车 输入命令npx create react app my app等待项目初始化 等待一段时间
  • 【虾说区块链】4个概念解析区块链

    欢迎收听 虾说区块链 现在区块链这个概念在互联网上相当火热 这里简单做一个普及 不涉及项目推广投资 单纯地对区块链相关基础知识概念作一个说明讲解 本人区块链技术爱好者 结合相关区块链资料总结整理了 虾说区块链 也是自己一个学习笔记 涉及相关
  • 深入React源码揭开渲染更新流程的面纱

    转前端一年半了 平时接触最多的框架就是React 在熟悉了其用法之后 避免不了想深入了解其实现原理 网上相关源码分析的文章挺多的 但是总感觉不如自己阅读理解来得深刻 于是话了几个周末去了解了一下常用的流程 也是通过这篇文章将自己的个人理解分
  • java入门篇

    MyEclipse 8 5编辑器 package second public class test public static void main String args 单行注释System out println java practi
  • Java中StringBuilder和StringBuffer用法以及区别

    Java是目前最为流行的编程语言之一 而字符串则是Java程序中不可避免的部分 在字符串的处理中有两个类 StringBuilder和StringBuffer 这两个类都实现了对可变字符串的操作 在一定程度上可以替代String的功能 但它
  • Jenkins 安装提示:Please wait while Jenkins is getting ready to work...

    http mirror xmission com jenkins updates update center json 重启Jenkins 服务即可
  • Apache Druid分析型数据库设计-查询处理

    Apache Druid系列博客 Apache Druid简介 Apache Druid设计 架构 存储设计 查询处理 本文 官方英文原文 Query processing 查询处理 查询分布在Druid集群中 由Broker进行管理 查询
  • 持续集成——jenkins自动化测试环境安装部署

    介绍 Jenkins是一个独立的开源软件项目 是基于Java开发的一种持续集成工具 用于监控持续重复的工作 旨在提供一个开放易用的软件平台 使软件的持续集成变成可能 前身是Hudson是一个可扩展的持续集成引擎 可用于自动化各种任务 如构建
  • 国内有比Damus更强的去中心化社交,王兴的区块城市这次又抄对了?

    近十天来 一款基于去中心化社交协议Nostr 的客户端Damus突然爆火 刷屏了很多人的朋友圈 也激发了国内Web3创业者对社交赛道的关注和讨论 而在这场仍在持续发酵的网络热潮中 原本定位于元宇宙城市的BlockCity 区块城市 不仅被很
  • 我对JavaScript中this的一些理解

    因为日常工作中经常使用到this 而且在JavaScript中this的指向问题也很容易让人混淆一部分知识 这段时间翻阅了一些书籍也查阅了网上一些资料然后结合自己的经验 为了能让自己更好的理解this 进而总结一篇文章 this 是什么 t
  • 科技不断完善刷脸支付变得更安全

    支付宝正式推出刷脸支付功能 在我们腾不出手来或是忘记各种各样的密码可以选择往付款摄像头一站随后输入号码就支付完成 整个过程不足十秒钟 随着科学技术的不断完善 刷脸也会变得更加安全 不过就目前的安全来看 日常使用刷脸支付没有任何问题 刷脸支付
  • 用两个栈实现队列(C++实现)

    用两个栈实现队列 用两个栈实现一个队列 队列的声明如下 请实现它的两个函数 appendTail 和 deleteHead 分别完成在队列尾部插入整数和在队列头部删除整数的功能 若队列中没有元素 deleteHead 操作返回 1 示例 1
  • Java并发编程实战——并发容器之ThreadLocal及其内存泄漏问题

    文章目录 ThreadLocal的简介 ThreadLocal的实现原理 ThreadLocalMap详解 ThreadLocal内存泄漏问题 ThreadLocal的使用场景 ThreadLocal的简介 之前写过用ThreadLocal
  • [Html JS] 判断IE的版本

    判断IE的版本 var IEVersion function checkIEVersion if navigator appName Microsoft Internet Explorer navigator appVersion matc
  • SpringBoot+Vue微人事实战---Mybatis Generator插件一键生成数据库驱动层(2)

    今天完成微人事的数据库驱动 主要使用Mybatis generator 这个工具能根据数据库一键生成domain dao mapper层的代码 非常方便高效 奥力给 造它就完了 如果还没看前文的 点此传送SpringBoot Vue微人事实
  • 吴恩达ChatGPT《LangChain Chat with Your Data》笔记

    文章目录 1 Introduction 2 Document Loading 2 1 Retrieval Augmented Generation RAG 2 2 Load PDFs 2 3 Load YouTube 2 4 Load UR
  • WebSocket心跳机制

    WebSocket是HTML5开始提供的一种浏览器与服务器进行全双工通讯的网络技术 属于应用层协议 WebSocket 使得客户端和服务器之间的数据交换变得更加简单 允许服务端主动向客户端推送数据 1 创建webSocket Create