【自用笔记】webSocket 心跳机制、断线重连

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

在业务中需要使用webSocket定时给后台上传位置,防止以后忘记,在这里进行记录,直接在代码中写入笔记;

<template>
  <div id='main' ref='main'>
    <van-button @click="OnLocation">开启</van-button>
    <van-button @click="OnClose">关闭socket</van-button>    
  </div>
</template>
<script>
    export default {
        data() {
            return {
                lc: {},                 // 经纬度
                ws: null,               // webSocket实例
                webSocketState: false,  // webSocket的连接状态
                heartBeat: {            // 心跳连接的时间设置
                  time: 5 * 1000,      // 心跳时间间隔
                  timeout: 3 * 1000,   // timeout:心跳超时间隔(!要少于心跳间隔)
                  reconnect: 10 * 1000  // 断线重连时间
                },
                reconnectTimer: null,  // 断线重连时间器
            }
        },
        methods: {
            OnClose() {
                this.ws.close();              //关闭webSocket连接
                this.webSocketState = false;  //关闭状态
                this.heartBeat.time = null;   //停止心跳
                if (this.reconnectTimer) {    //关闭重连
                  clearInterval(this.reconnectTimer);
                }
             },
            //开启按钮
            OnLocation() {
                this.heartBeat.time =  5 * 1000;  //因为关闭时会置空,所以在这重新初始化一下
                this.wlhy.getLocation();          //这里是我自己业务中取经纬度的,
                this.connectWebSocket();          //建立连接
            },
            //socket链接
            connectWebSocket() {
                let url = `wss://ws://baidu.com/msg/${this.userInfo.userId}`;  
                //这里连接地址根据自己的业务设置,注意:如果连接本地进行调试的时候,要用'ws',如:“ws://192.168.2.15:8080/msg”
                this.ws = new WebSocket(url);
                this.init();  //初始化
             },
             init() {
                this.ws.addEventListener('open', () => {
                // eslint-disable-next-line spaced-comment
                this.webSocketState = true; //socket状态设置为连接,做为后面的断线重连的拦截器
                // eslint-disable-next-line no-unused-expressions
                console.log('开启');
                this.heartBeat && this.heartBeat.time ?     this.startHeartBeat(this.heartBeat.time) : ''; // 是否启动心跳机制
                });
                this.ws.addEventListener('message', (e) => {
                  this.webSocketState = true;
                  console.log(JSON.parse(e.data),'信息')
                });
                this.ws.addEventListener('close', (e) => {
                  this.webSocketState = false; // socket状态设置为断线
                  console.log('断开了连接');
                });
                this.ws.addEventListener('error', (e) => {
                  this.webSocketState = false; // socket状态设置为断线
                  this.reconnectWebSocket(); // 重连
                  console.log('连接发生了错误');
                });
              },
              // 心跳  time:心跳时间间隔
              startHeartBeat(time) {
                setTimeout(() => {
                  //这里设置这是你要发送的内容
                  let data = {};
                  data.lon = this.lc.longitude;            //已省略获取地址步骤
                  data.lat = this.lc.latitude;
                  this.ws.send(JSON.stringify(data))       //发送数据
                  this.waitingServer();                    
                }, time);
              },
             // 延时等待服务端响应,通过webSocketState判断是否连线成功
              waitingServer() {
                this.webSocketState = false;  
                setTimeout(() => {
                  if (this.webSocketState) {
                    this.startHeartBeat(this.heartBeat.time);
                    return;
                  }
                  console.log('心跳无响应,已断线');
                  try {
                    this.ws.close();
                  } catch (e) {
                    console.log('连接已关闭,无需关闭');
                  }
                  this.reconnectWebSocket();  //非主动关闭导致,触发重连
                }, this.heartBeat.timeout);
              },
              // 重连操作
              reconnectWebSocket() {
                this.reconnectTimer = setTimeout(() => {
                  this.reconnectWs();
                }, this.heartBeat.reconnect);
              },
              reconnectWs() {
                if(!this.heartBeat.time) return //如果主动关闭,则防止重连
                if (!this.ws) {
                  // 第一次执行,初始化
                  this.connectWebSocket();
                }
                if (this.ws && this.reconnectTimer) {
                  // 防止多个websocket同时执行
                  clearTimeout(this.reconnectTimer);
                  this.ws.reconnectTimer = null;
                  this.connectWebSocket();
                }
              },
        },

    }
</script>

注意:我在开发过程中发现,当我主动关闭连接后,在重连时间内会自动重新开启连接,这是因为websocket连接关闭会又走一次重连机制,所以 如果你是使用的定时器,可以直接清除定时器,或者定义一个变量控制是组件销毁关闭的websocket还是心跳监测重连时关闭的websocket,如果是像我一样,可以判断this.heartBeat.time,关闭后置空,判断return就可以了;

下面是直接用定时器做的心跳(在这里没有主动关闭的功能)

<script>
    export default {
    name: "clockIn",
    data(){
      return {
        lc: {},           //经纬度(获取过程省略)
        interval: null,   //定时器
        socket: null,     //socket
      }
    },
    mounted() {},
    methods: {
        initSocket() {
            /**主流浏览器都支持 webSocket 通信,但建议还是要判断*/
            if ("WebSocket" in window) {
              if (this.socket) {
                this.socket.close();
              }
              /**创建 web socket 实例
               * 如果连接失败,浏览器控制台报错,连接失败
               * 前缀 ws:// 必须正确,weChatInteract 是应用名称,webSocket/shake.action 是后台访问路径
               * */
              
              let url = `ws://192.168.2.15:8080/msg`;
              this.socket = new WebSocket(url);

              let _this = this;
              /**onopen:服务器连接成功后,自动触发*/
              this.socket.onopen = function() {
                this.interval = setInterval(function() {
                  /** Web Socket 已连接上,使用 send() 方法发送数据*/
                  let data = {};
                  data.lon = lc.longitude;
                  data.lat = lc.latitude;
                  console.log(data)
                  _this.socket.send(JSON.stringify(data))
                  console.log("服务器连接成功,并发送数据到后台...");
               },30000)
             }

             /**服务器发送数据后,自动触发此方法,客户端进行获取数据,使用 evt.data 获取数据*/
             this.socket.onmessage = function(msg) {
                if (msg.data && msg.data != 'messageCenter login success') {
                  // let message = JSON.parse(msg.data);
                  console.log(message,'=> 接收到服务器数据')
                }
              }

            /**客户端与服务器数据传输错误时触发*/
            this.socket.onerror = function (evt) {
                console.log("客户端 与 服务器 数据传输错误...");
            };

            /**web Socket 连接关闭时触发*/
            this.socket.onclose = function(e) {
                console.log("web scoket 连接关闭...");
                if (this.interval) {
                  clearInterval(this.interval);
                }
                setTimeout(function() {
                  _this.initSocket();
                },5000)
            }

         } else {
              console.log("浏览器不支持 WebSocket!");
         }
      },
    },
</script>

参考链接:

websocket的基础使用,心跳机制,断线重连_websocket断开后怎么自动连接-优快云博客

关于WebSocket的心跳重连机制(详解)_websocket 心跳-优快云博客

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

相关推荐

Colyseus 的断线重连和心跳机制

Colyseus 是一个专注于实时多人游戏开发的 WebSocket 框架,支持客户端断线重连和心跳功能以保持连接稳定性。这些功能对于多人游戏或实时协作应用至关重要,确保即使在网络波动时,玩家或用户的状态不会丢失。

maply的博客 965

WebSocket的心跳机制和断线重连

心跳机制的实现,在客户端连接成功的回调中即开启心跳。心跳处理函数内部使用定时器延时触发向服务端发送消息的方法,待服务器将消息返回证明是连线成功状态下,继续调用心跳检测方法。如果客户端给服务端发送心跳消息,在定义的超时时间后客户端没有收到回复,则说明和服务端断线了,此时会触发到客户端连接关闭的回调函数,在此回调中发起重新连接websocket。

weixin_45313351的博客 2万+

WebSocket心跳机制的原理你知道多少?

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

前端程序员、项目经理、人工智能博主 1066

websocket的基础使用,心跳机制,断线重连

websocket的基础使用,心跳机制,断线重连。传统的http请求只能是由前端向后台发送一个请求,然后后台把结果返回给前端,前端再进行展示。这里就暴露了一个问题,就是通信只能由前端发起,而后台无法主动与前端通信。而websoket的出现就是为了解决这个问题,让前端可以主动联系后台,后台也可以主动联系前台。相信大家都知道websoket的应用场景主要是用于即时通讯,比如QQ、微信即时通讯软件,同时在一些实时监控,需要即时暴露问题的地方也需要用到websoket,比如大屏可视化,需要及时的展现商品的成交数量。

weixin_43239880的博客 1万+

从2804云台电机到桌面机械臂:一个STM32/GD32玩家的FOC驱动踩坑全记录

本文详细记录了从2804云台电机到桌面机械臂的FOC驱动开发历程,涵盖了硬件选型、驱动方案优化、软件调试等关键环节。特别分享了L6234P驱动芯片的发热问题、AS5600编码器的I2C通信陷阱以及PID调参的实战经验,为DIY爱好者提供了宝贵的参考。

weixin_26897585的博客 483

Python金融数据获取工具库之baostock使用详解

在金融数据分析和量化交易中,获取准确及时的市场数据是非常重要的。baostock是一个专门为中国股市数据提供支持的 Python 库,它提供了免费的股票数据接口,用户可以方便地获取股票、指数、基金等各种金融数据。本文将详细介绍baostock库,包括其安装方法、主要特性、基本和高级功能,以及实际应用场景,帮助全面了解并掌握该库的使用。

Rocky006的博客 5348

WebSocket使用及优化(心跳机制与断线重连)

WebSocket在2008年被提出,其通信协议于2011被制定为标准 websocket支持全双工通信(即:在客户端和服务之间双向通信)在websocket问世之前,客户端与服务器通常采用http轮询和Comet等方式保持长链接 然而,这么做无疑会对服务端造成资源消耗,因为HTTP请求包含较长的头文件,只传递了少许的有用信息,十分消耗资源。 于是websocket便诞生了,它不仅节省资源和带宽,更是能实现长链接作用,只需客户端主动与服务端握手一次,即可进行实时通信,实现推送技术。

00后|互联网💻|办公室🍵茶农,希望通过技术改变生活|爱折腾💪|收集各类📚网络资源,好物不私藏,点点关注,不迷路。 全网搜:阿宇的编程之旅 or 阿宇的宝库 6181

Sony DPT RP1/CP1破解攻略

前言 自己有一台Sony DPT CP1和一台kindle,两个都已经用了很多年。直到最近发现微信读书上经常可以找到一些免费而且不错的书,所以就萌生了在两台机器上使用微信读书的想法。kindle比较容易实现,直接打开内置浏览器,进入微信读书网页版就行了,而Sony的电纸书则只能通过破解+安装微信读书的方式实现。大概弄了两三个小时吧,也遇到了一些问题,所以这里记录一下整个过程,希望能方便后来的使用者。 首先感谢HappyZ, osc_t5nbj8ds。前者是提供公开破解的方法的大神,后者则是解决了我遇到的问题

weixin_43467572的博客 1万+

记录一下uniapp开发小程序使用websocket实现断线重连以及心跳机制

uniapp开发小程序使用websocket实现断线重连以及心跳机制背景业务问题断线重连心跳机制官网方案我的方案大神方案 背景 业务 我们公司为甲方做一个报价类的小程序,别人报价可以实时的监听到,这样就肯定需要消息通讯机制,并且我们这个业务是双端同时操作的,也就是网页端有网页端的报价功能,小程序有小程序的,而且内容是一个的,也就是同时可以在小程序和网页端报价,这里websocket就离不开了 问题 因为一般牵扯到websocket就应该要想到实现断线重连和心跳机制的问题,毕竟websocket是一个长

mataodehtml的博客 6526

杭电oj2023题题目详解(Java版)

杭电oj2023题详解

m0_51065958的博客 978

MLX90640 热成像 STM32

MLX90640 热成像

zhaocundang's blog 5008

WebSocket心跳机制(笔记大全)

第一种方式会对服务器造成很大的压力,因为即使WebSocket连接正常,也要定时发送心跳包,从而消耗服务器资源。WebSocket心跳机制是必要的,它可以使WebSocket连接保持长连接,避免断开连接的情况发生。WebSocket心跳机制的原理是利用心跳包及时发送和接收数据,保证WebSocket长连接不被断开。WebSocket需要心跳,因为WebSocket连接可能会因为长时间没有数据传输而被断开,而心跳机制可以及时检测连接状态,保持WebSocket长连接。

zz130428的博客 2万+

备考路上的学习笔记:我的软考高级架构师复盘与更新计划

本专栏基于作者备考软考高级系统架构设计师的真实经验,分为考前突击、基础夯实、核心突破、案例实战和论文通关五大模块。内容涵盖计算机体系结构、操作系统、数据库等核心知识,提供案例解析和论文范文。作者承诺持续更新考纲内容、真题复盘及互动答疑,旨在帮助考生系统备考,将个人踩坑经验转化为实用指南,陪伴考生共同完成从知识碎片到体系构建的蜕变历程。

qq837993702的博客 2295

WebSocket 心跳检测 重连

WebSocket 心跳检测 重连

我是 二川兄,对Web开发、GIS开发、3D模型、机器学习、面试技巧等方面都有一些涉猎~ 欢迎您加入技术交流圈!你可以在我的文章末尾找到我~ 5978

从零开始讲PCIe(8)——PCIe拓扑与组件

从软件角度来看,根复合体内部的总线结构会被认为是一个标准的PCI总线,尽管实际上可能并不是物理的PCI总线,但它被设计为对软件呈现为PCI拓扑的一部分,以保持与旧版PCI软件的兼容性。这是由于其使用了非常高的传输速度。无论是根复合体内部的总线,还是交换机的多个端口,系统会通过与PCI相似的方式将其呈现给软件,使得传统的PCI枚举和配置流程能够继续使用。总体而言,根复合体不仅在物理上位于PCIe拓扑的顶部,而且在逻辑上也是整个PCIe系统的控制中心,它与系统中的所有PCIe设备建立连接,协调它们之间的通信。

apple_53311083的博客 2991

有趣的方式学习DDR5(4)—— DDR5 SDRAM 启动与初始化过程全攻略

🟢。

weixin_43199439的博客 1624

webSocket的基本使用以及心跳检测、断线重连

为了获取实时数据,前端需要和后端保持通信,HTTP 协议只能是客户端向服务器发出请求,服务器返回查询结果。这种单向请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦。我们只能使用"轮询":每隔一段时候,就发出一个询问,了解服务器有没有新的信息。

m0_64227118的博客 1万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Websocket 断线重连及心跳问题解决方案

Websocket 断线重连及心跳问题解决方案预备代码解决方案断线重连心跳 预备代码 为描述方便,先将简单的 Websocket 连接函数 ws_connect() 贴出来,ws 为 Websocket 对象: var ws; /** * 连接 websocket * @param func onopen要执行的函数,可以为空 */ function ws_connect(func) { ...

sybil06的博客 1万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

websocket前端封装代码,心跳机制断线重连

前端websoket封装 具体代码/使用方法 原理讲解

weixin_44383533的博客 2719

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

小程序WebSocket心跳检测,断线重连

我把小程序WebSocket的一些功能封装成一个类,里面包括建立连接、监听消息、发送消息、心跳检测、断线重连等等常用的功能。 export default class websocket { constructor({ heartCheck, isReconnection }) { // 是否连接 this._isLogin = false; // 当前网络状态 ...

无鳍之鲨的博客 4980

VUE下封装全局STOMP WebSocket及断线重连机制

最近一个后台管理项目中需要使用websocket跟服务器建立长连接,以便实时通信,一番百度查阅后,决定使用Stomp+websocket形式。网上简单的链接demo倒是很多,能真正发布到生产环境使用的却很少,尤其断线重连机制,一直没找到理想参考,于是决定自己写了,特此记录,以备查阅。本示例是全局使用的websocket,初始化成功后,可在任意页面或组件中调用,由于使用了stomp,可以基于主题订阅模式跟服务器端交互,使用起来非常方便。 在store文件夹下新建:websocket.js import

shengfakun1234的专栏 9232

项目实战:websocket实现心跳检测和断线重连

项目实战:websocket实现心跳检测和断线重连

太阳与星辰的博客 1381

Vue项目全局创建WebSocket连接(支持断线重连和心跳检测)

首先创建WebSocket.js文件,我把它放在了src/js/websocket.js路径下 WebSocket.js: import store from '@/store' import { Message } from 'element-ui' var url = 'ws://127.0.0.1:9090/websocket/' var ws; var tt; var lockReconnect = false;//避免重复连接 var clientId = localStorage.getIte

weixin_42817587的博客 9330

uniapp小程序webSocket封装、断线重连、心跳检测

最近在做IOT的项目,里面有个小程序要用到webSocket,借这个机会,封装了一个uniapp小程序适用的Socket类

鹏多多的博客 4532

websocket手机端实现、断线重连、心跳机制

websocket:手机端实现、断线重连、心跳机制。并将内容推送到手机通知栏。 $(window).load(function() { var windowUp = window.top ? window.top : window; var lockReconnect = false; var ws; //websocket对象 var initWebSocket = function() { var wsUrl = "ws://example";//websocket-url var

XIADANXIN的博客 1350
上一篇: 【自用笔记】关于store存储
下一篇: 【自用笔记】关于移动端左滑返回的操作
林希雨
博客等级 码龄4年 84粉丝 13原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值