如何(关闭)断开 Websocket 连接:简单易懂的实现指南

news2024/11/15 19:58:37

WebSocket 协议提供了一条用于 Web 应用程序中双向通讯的高效通道,让服务器能够实时地向客户端发送信息,而无需客户端每次都发起请求。本文旨在探讨有关结束 WebSocket 连接的适当时机,内容包括协议的基础知识、如何结束连接、一些使用场景,以及归纳总结。

image.png

WebSocket 的基础

WebSocket 协议运作在 TCP 之上,并通过 HTTP 握手升级协议以建立持久连接。这种机制允许数据在服务器和客户端之间双向流动。不同原因会导致需要终结这些连接。

终结连接的常见原因

  • 主动关闭:用户或应用程序明确进行关闭操作,例如关闭浏览器窗口或跳转页面。
  • 闲置超时:长时间无交互,双方可以基于超时逻辑关闭连接,节约资源。
  • 错误:服务端或客户端错误可能导致连接断开。
  • 网络问题:网络不稳定或断连可致 WebSocket 连接断开。
  • 协议不符:双方 WebSocket 协议版本不兼容或存在协议违背行为。
  • 资源限制:服务器为了保持性能,可能会限制连接数,超出限制时关闭部分连接。
  • 安全政策:基于安全考量,特定的连接请求可能会被拒绝。
  • 会话失效:身份验证过期需要用户重新登录。
  • 维护:服务器维护或升级可能需要临时关闭连接。

结束连接的手段

服务端主动关闭

服务端可以通过发送一个含有特定关闭码的帧来主动结束连接。

const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 3000 });

wss.on('connection', (ws) => {
  ws.close(1000, '服务端结束连接');
});

客户端主动关闭

客户端也可发送关闭帧结束连接。

const socket = new WebSocket('ws://example.com');
socket.close(1000, '客户端主动断开');

闲置超时

双方可设定超时机制,若一定时间内无数据传输则自动关闭连接。

实际操作案例

设想构建一个在线聊天应用,若用户一段时间无活动,则服务器断开其 WebSocket 连接。

const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 3000 });

wss.on('connection', (ws) => {
  let isActive = true;

  ws.on('message', (message) => {
    if (isActive) {
      // 消息处理逻辑...
    }
  });

  const timeout = setTimeout(() => {
    if (!isActive) {
      ws.close(1000, '用户闲置过久');
    }
  }, 60000); // 60秒超时

  ws.on('pong', () => {
    isActive = true;
  });

  ws.on('close', () => {
    clearTimeout(timeout);
  });
});

在 Apifox 中测试 WebSocket

试验 WebSocket 接口以验证应用的功能,这时 Apifox 的强大测试能力派上用场了。只需新建一个 HTTP 项目,添加一个 WebSocket 接口,输入服务器 URL,享受其简易的测试流程。

image.png

小结

理解 WebSocket 连接何时应当结束至关重要,无论是主动操作、超时还是出于安全和性能考虑。正确管理这些连接有益于资源节约、安全保障和用户体验提升。通过本文的介绍和案例,希望能帮助您更好地理解并实施 WebSocket 连接管理策略。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1568480.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

本地运行github上下载的项目--接Git入门篇

1.了解项目 这是一个基于Spring Boot 和 Mybatis Plus 构建的Java项目,很经典的外卖项目,参考b站的黑马瑞吉外卖。 2.构建项目 SpringBoot项目,首先下载一些常见的项目要求的组件。然后配置如下: 看README,在阅读该…

深入理解计算机系统 家庭作业 2.80

/* 网上很多都没说清楚到底出题人是什么用意,用意就是既要又要,既要不溢出,又要不丢失精度.所以就分开处理,在丢失之前把丢失的部分保存下来,然后两部分算好再相加. 可以先看一下我的2.79题 用的是先乘后除 会溢出 符合题意 2.80要求的是先除后成 不会溢出 但会丢失精度 核…

1.3 操作系统的运行机制、中断与异常、系统调用

一、操作系统的运行机制 知识框图: (一)程序 内核程序:内核程序是操作系统的核心部分,需要在内核模式下运行,负责管理计算机的硬件资源,如处理器、内存、存储设备和输入输出设备。内核程序还负…

自动驾驶中各种坐标系辨析

坐标系辨析 0. 地球椭圆体1. 大地坐标系2. eci地心惯性坐标系3. 地心地固坐标系(ECEF坐标系,E系)4. 站心坐标系(ENU坐标系)5. UTM坐标系6. LTM坐标系7. IMU坐标系8. 代码部分8.1 LLA(大地坐标系坐标、经纬度海拔)坐标转LTM系(ENU系)下的三维笛卡尔坐标8.2 LLA坐标转…

Coursera上Learning Linux for LFCA Certification专项课程01:Linux Fundamentals 学习笔记

Linux Fundamentals Course Certificate 本文是 Linux Fundamentals 这门课的学习笔记,如有侵权,请联系删除。 文章目录 Linux FundamentalsWeek 01: Linux Operating SystemLearning Objectives Specialization OverviewHistory of LinuxQuiz: Hist…

公众号搜索被降权后多久能恢复?

公众号搜索被降权后的恢复时间是一个复杂的问题,它涉及到多种因素的综合考量。首先,违规的严重程度是一个重要的因素。如果违规行为较为轻微,可能只需要较短的时间就能恢复搜索权重;而如果违规行为较为严重,可能需要更长的时间&am…

2023年CSP-J第一轮题目讲解

大家好,我是极风。由于当年的初赛考的很差(没考过70分),所以现在打算拿出来再细看一下。 一、 单项选择题(共15题,每题2分,共计30分:每题有且仅有一个正确选项) 1. 在…

【mT5模型】mT5: A Massively Multilingual Pre-trained Text-to-Text Transformer

【mT5模型】mT5: A Massively Multilingual Pre-trained Text-to-Text Transformer 论文信息 阅读评价 Abstract Introduction Background on T5 and C4 mC4 and mT5 mC4 mT5 Comparison to related models Experiments Zero-shot generation Illegal predictions Pre…

Plonky2.5:在Plonky2中验证Plonky3 proof

1. 引言 Plonky2.5为QED Protocol团队主导的项目,定位为: 在Plonky2 SNARK中验证Plonky3 STARK proof。 从而实现Plonky系列的递归证明。 开源代码实现见: https://github.com/QEDProtocol/plonky2.5https://github.com/Plonky3/Plonky3&a…

CSGO比赛赛事大科普,Major并不是一个赛事!

关于CSGO比赛,有很多人都听过许多相关名词:Major、Minor、IEM、EPL、ESL ONE、Dreamhack、ESEA、Blast、EPICENTER等等,但大家有没有想过这些名词所代表的含义呢? Major、Minor严格意义上说,Major、Minor本身并不是赛事…

Prometheus+grafana环境搭建方法及流程两种方式(docker和源码包)(一)

1.选型对比 最近项目上有对项目服务及中间件的监控需求,要做实现方案调研,总结一下自己的成果,目前业界主流可选的方案有: 国外开源: Prometheus:Prometheus - Monitoring system & time series dat…

python ---- %r %s格式输出的区别

在python中, % s和 % r是我们常用的格式符,它们的用法基本一致,但作用却不尽相同,下面简要说明一下两者的区别: 1. % s是将对象 / 变量传递到str()方法中,并将其转化为面向用户的可阅读的格式。 2. % r是将…

【竞技宝jjb.lol】LOL:WBG拒绝让二追三击败LNG晋级第三轮

北京时间2024年4月4日,英雄联盟LPL2024春季季后赛继续进行,昨天迎来次轮LNG对阵WBG。本场比赛WBG气势如虹的二连胜后被LNG连追两局,最后一局scout的小炮连续失误葬送局势,最终WBG3-2力克LNG晋级第三轮。以下是本场比赛的详细战报。 第一局: 首局比赛,LNG在蓝色方,WBG在红色方。…

Python基础之pandas:字符串操作与透视表

文章目录 一、字符串操作备注:如果想要全部行都能输出,可输入如下代码 1、字符检索2、字符转换3、字符类型判断4、字符调整5、字符对齐与填充6、字符检索7、字符切割8、字符整理 二、透视表1、pd.pivot_table2、多级透视表 一、字符串操作 备注&#xf…

【Python系列】Python中的YAML数据读取与解析

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

JavaSE——运算符

1. 概念 运算符是一种用于执行特定操作的符号或关键字。在编程中,运算符用于对变量、常量和表达式进行操作,以产生一个结果。 作为一门计算机语言, Java 也提供了一套丰富的运算符来操纵变量。 Java 中运算符可分为以下:算术运算…

前端订阅后端推送WebSocket定时任务

0.需求 后端定时向前端看板推送数据,每10秒或者30秒推送一次。 1.前言知识 HTTP协议是一个应用层协议,它的特点是无状态、无连接和单向的。在HTTP协议中,客户端发起请求,服务器则对请求进行响应。这种请求-响应的模式意味着服务器…

Waifu2x:使用深度卷积神经网络的动漫风格艺术的图像超分辨率

Github网址:nagadomi/waifu2x:动漫风格艺术的图像超分辨率 (github.com) 该项目主要讲述的是如何利用预训练的深度学习模型来达到无损扩大收缩和去噪,对于一般训练图像的小伙伴应该很清晰图像经常要通过resize操作固定大小,然后c…

Docker,anaconda环境的部署与迁移

功能上线将提上日程,但是如何将我windows环境下的程序放到linux服务器的测试环境跑通呢?这是我这整个清明假期将要解决的一件事,最蠢的办法就是看自己的环境下有哪些依赖,如何到服务器上一个一个下,但是首先这个方法很…

C#,简单,精巧,实用的按类型删除指定文件的工具软件

点击下载本文软件(积分): https://download.csdn.net/download/beijinghorn/89059141https://download.csdn.net/download/beijinghorn/89059141 下载审核通过之前,请从百度网盘下载(无积分):…