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

详解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日

相关文章

  • JavaScript的Date()方法使用详解

    JavaScript的Date()方法使用详解 介绍 Date() 方法以字符串或数值为参数创建一个新的 Date 对象。如果不传递参数,Date() 将返回当前时间。 语法 new Date(); new Date(value); new Date(dateString); new Date(year, month, day, hours, minutes…

    JavaScript 2023年5月27日
    00
  • js中settimeout方法加参数

    当调用 setTimeout() 方法时,可以为其传递一个或多个参数,这些参数将被传递给所调用的函数。下面是使用 setTimeout() 方法传递参数的详细步骤: 1. 语法 setTimeout(function[, delay, param1, param2, …]); 2. 参数含义 function:必需。要执行的函数或要调用的函数表达式。 d…

    JavaScript 2023年6月11日
    00
  • js下用eval生成JSON对象

    使用eval函数可以将字符串转换为JavaScript代码执行,因此可以使用eval生成JSON对象。以下是生成JSON对象的完整攻略: 1. 准备JSON字符串 首先,你需要准备一个字符串表示的JSON数据。这个JSON字符串必须遵循JSON语法规范,且必须被引号包裹。下面是一个示例JSON字符串: var jsonStr = ‘{"name&q…

    JavaScript 2023年5月27日
    00
  • 如何在JavaScript中创建具有多个空格的字符串?

    要在JavaScript中创建具有多个空格的字符串,可以使用多种方法,以下是几个示例说明: 1. 使用空格符 可以直接在字符串中使用空格符(’ ‘)来添加空格。需要注意的是,字符串要用双引号或单引号引起来,避免其他字符干扰,示例代码如下: let str = "Hello World"; // 注意这里使用了四个空格符 console.l…

    JavaScript 2023年5月28日
    00
  • JS 俄罗斯方块完美注释版代码

    JS 俄罗斯方块完美注释版代码是一款非常经典的俄罗斯方块游戏,在学习 JavaScript 编程的过程中非常适合进行体验和学习。下面,我将给出关于这款游戏的完整攻略,帮助初学者更好地理解代码和游戏逻辑。 准备工作 在开始阅读代码之前,我们需要先完成以下准备工作: 安装浏览器:在电脑上安装 Google Chrome、Firefox 等主流浏览器。 下载源代码…

    JavaScript 2023年5月28日
    00
  • 功能很全的精品JS计算器

    我们的“功能很全的精品JS计算器”具有以下功能: 基本的加减乘除运算 百分数和倒数运算 可以处理复杂的多位运算和顺序运算 具有清空和退格功能 下面是使用该计算器的详细攻略: 界面介绍 打开网页后,你会看到一个设计精美的计算器界面。它包含了数字键盘、运算符号、等于号、清空和退格按钮。在输入框中,你可以输入一个表达式,然后按下等于号计算它的结果。在输入过程中,如…

    JavaScript 2023年5月28日
    00
  • JS 实现Base64编码与解码实例详解

    JS 实现Base64编码与解码实例详解 Base64是一种将二进制数据编码为ASCII字符的方法。通过该编码方式,可以将二进制数据以可读的方式在不同系统中传输或储存。 什么是Base64 在计算机中,数据存储都是以二进制位(bit)为单位的,但是在我们人类的角度下,二进制是很难读懂的,如00101011。因此为了呈现数据,可以采用16进制、ASCII等方式…

    JavaScript 2023年5月20日
    00
  • jQuery结合HTML5制作的爱心树表白动画

    下面是“jQuery结合HTML5制作的爱心树表白动画”完整攻略。 简介 本攻略旨在让读者了解如何使用jQuery和HTML5制作爱心树表白动画。爱心树表白动画是一种浪漫的表白方式,可以通过动画效果展现出心意,深受情侣们的喜爱。 准备工作 在开始制作之前,需要先准备好下面这些工具: 一个文本编辑器,比如Sublime Text、Atom等 一张背景图片 一个…

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