详解JS WebSocket断开原因和心跳机制

yizhihongxing

详解JS WebSocket断开原因和心跳机制

WebSocket 是一个重要的协议,可在浏览器和服务器之间双向通信,且具有较低的延迟和较高的带宽利用率。但是,在实际应用中,WebSocket 经常会由于各种原因而断开连接,为此,我们需要对 WebSocket 的断开原因和心跳机制做详细了解。

WebSocket断开原因

1. 服务器主动关闭

服务器端主动关闭连接时,WebSocket 处于 CLOSED 状态,并触发 onclose 事件。在这种情况下,我们可以读取 event.codeevent.reason 属性获取关闭代码和关闭原因。

示例代码(服务端):

wsServer.close(reason, code);

示例代码(客户端):

ws.onclose = function(event) {
  console.log("WebSocket已关闭。");
  console.log("关闭代码:" + event.code);
  console.log("关闭原因:" + event.reason);
}

2. 客户端主动关闭

客户端主动关闭连接时,WebSocket 处于 CLOSED 状态,并触发 onclose 事件。在这种情况下,我们需要手动调用 WebSocket.close() 方法来关闭连接。

示例代码:

ws.close();

3. 网络异常

网络异常是导致断开连接的最常见原因之一。在这种情况下,WebSocket 处于 CLOSED 状态,并触发 onclose 事件。网络异常断开连接时,event.code 的值为 1006,event.reason 的值可能为空字符串或某些异常信息。

4. 服务器异常

服务器异常有许多种,可能是服务器程序崩溃、服务器网络故障等。在这种情况下,WebSocket 处于 CLOSED 状态,并触发 onclose 事件。服务器异常断开连接时,event.code 的值可能是任意的 4000 到 4999 之间的错误代码(由服务器指定),event.reason 的值可能为空字符串或某些错误信息。

WebSocket心跳机制

WebSocket 心跳机制是指定期向服务器发送一条心跳消息来保持连接的机制。WebSocket 心跳一般有两种实现方式:

1. 客户端轮询

客户端轮询是指客户端间隔一段时间向服务器发送一条消息,服务器收到消息后立即回复,客户端收到回复后重新计时。如果一定时间内没有收到服务器回复,客户端即认为连接断开。

示例代码:

let heartbeatTimer = null;

function startHeartbeat() {
  heartbeatTimer = setInterval(() => {
    if (ws.readyState === WebSocket.OPEN) {
      ws.send(JSON.stringify({type: "heartbeat"}));
    }
  }, 3000);
}

function stopHeartbeat() {
  clearInterval(heartbeatTimer);
}

2. 服务器推送

服务器推送是指服务器定期向客户端推送一条消息,客户端收到消息后重新计时。如果一定时间内没有收到服务器推送,客户端即认为连接断开。

示例代码:

ws.onmessage = function(event) {
  let data = JSON.parse(event.data);
  if (data.type === "heartbeat") {
    // 接收到服务器心跳消息,重新计时
    resetHeartbeat();
  }
}

let heartbeatTimer = null;

function resetHeartbeat() {
  clearInterval(heartbeatTimer);
  heartbeatTimer = setInterval(() => {
    if (ws.readyState === WebSocket.OPEN) {
      ws.send(JSON.stringify({type: "heartbeat"}));
    }
  }, 3000);
}

总结

以上是 WebSocket 断开原因和心跳机制的详细讲解,我们需要在实际应用中结合具体情况,选择合适的心跳机制,保证 WebSocket 连接的稳定性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解JS WebSocket断开原因和心跳机制 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • 小程序实现计时器功能

    下面是“小程序实现计时器功能”的完整攻略: 1. 准备工作 在开始编写计时器功能之前,需要先创建一个小程序项目,并在页面中引入 wx.createInnerAudioContext() 实现计时结束后的声音提示。 2. 计时器实现 2.1 变量定义和初始值设置 首先,需要在 data 中定义计时器相关的变量,例如当前计时器的状态、计时器显示的时间等: dat…

    JavaScript 2023年6月11日
    00
  • javascript控制Div层透明属性由浅变深由深变浅逐渐显示

    要实现”JavaScript控制DIV层透明属性由浅变深由深变浅逐渐显示”,可以通过以下步骤实现: 创建一个DIV层并设置CSS样式,包括宽度,高度,背景颜色、位置等信息。如下所示: “`html “` 在JavaScript代码中获取该DIV层对象。 javascript var myDiv = document.getElementById(“myD…

    JavaScript 2023年6月11日
    00
  • HTML中不支持静态Expando的元素的问题

    “HTML中不支持静态Expando的元素的问题”指的是在某些HTML元素上添加特定属性或JS对象时,如果该元素不支持静态Expando,则可能会导致问题。通常,此类问题表现为少量JS工作正常,大量JS工作不正常。 以下是解决“HTML中不支持静态Expando的元素的问题”的攻略: 1.了解什么是静态Expando Expando是为DOM元素添加的自定义…

    JavaScript 2023年6月10日
    00
  • JavaScript深入理解作用域链与闭包详情

    JavaScript深入理解作用域链与闭包攻略 作用域链 在JavaScript中,作用域链是一种机制,它决定了变量和函数的访问权限。每个函数都有一个作用域链,它是由函数创建时所处的环境和所有父级环境的变量对象所组成。当函数执行时,它的作用域链会被用来解析变量和函数的引用。 示例一:作用域链的基本概念 var globalVar = ‘global’; fu…

    JavaScript 2023年6月10日
    00
  • 基于ajax的简单搜索实现方法

    接下来我会详细讲解“基于ajax的简单搜索实现方法”的完整攻略。 简介 在Web应用程序中,搜索功能是必不可少的。而基于ajax技术实现的搜索,具有很好的用户体验。本篇攻略将介绍如何使用ajax技术,实现一个简单的搜索功能。 准备工作 在开始实现搜索功能前,需要准备以下工作: 一个包含搜索功能的HTML页面 一个接收搜索请求的后端接口 一个用于展示搜索结果的…

    JavaScript 2023年6月11日
    00
  • CKeditor富文本编辑器使用技巧之添加自定义插件的方法

    CKEditor是一款常用的富文本编辑器,除了自带的插件外,也支持添加自定义插件,进一步增强其功能。下面将详细讲解如何使用CKEditor添加自定义插件。 准备工作 在添加自定义插件之前,需要先下载和安装CKEditor。推荐使用官方网站提供的在线自定义打包工具,可以选择需要的插件和语言包,生成符合自己需求的CKEditor的压缩文件。 添加自定义插件 下载…

    JavaScript 2023年6月10日
    00
  • javascript实现客户端兼容各浏览器创建csv并下载的方法

    在JavaScript中,可以通过Blob对象和URL.createObjectURL()方法来生成CSV文件,并通过a标签的download属性实现文件的下载。下面是实现客户端兼容各浏览器创建CSV并下载的完整攻略: 准备工作 在代码中创建用户需要下载的CSV内容数据 var data = [ [‘姓名’, ‘年龄’, ‘性别’], [‘张三’, ’18’…

    JavaScript 2023年5月27日
    00
  • 在element-ui的el-tree组件中用render函数生成el-button的实例代码

    下面是详细讲解“在element-ui的el-tree组件中用render函数生成el-button的实例代码”的完整攻略: 确定需求 我们需要在el-tree组件的每一个节点后面添加一个按钮,同时该按钮需要可以点击并绑定事件。 操作步骤 1.在el-tree的render函数中添加按钮 在element-ui的el-tree组件中,我们可以通过重写该组件的…

    JavaScript 2023年6月11日
    00
合作推广
合作推广
分享本页
返回顶部