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

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.hqwc.cn/news/591697.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【VUE】ruoyi框架自带页面可正常缓存,新页面缓存无效

ruoyi框架自带页面可正常缓存,新页面缓存无效 背景: 用若依框架进行开发时,发现ruoyi自带的页面缓存正常,而新开发的页面即使设置了缓存,当重新进入页面时依旧刷新了接口。 原因:页面name与 getRouters …

Ds18B20理解与运用

在51单片机中,DS18B20是一个十分重要的外设,它是一个温度传感器,可以读取温度并以16位的数据输出。这个数据由四位符号位,7位整数位和4位小数位组成。当符号位都是0的时候,温度是零上温度;当符号位都是1的时…

我与C++的爱恋:内联函数,auto

​ ​ 🔥个人主页:guoguoqiang. 🔥专栏:我与C的爱恋 ​ 一、内联函数 1.内联函数的概念 内联函数目的是减少函数调用的开销,通过将每个调用点将函数展开来实现。这种方法仅适用于那些函数体小、调用频繁的函数。 …

从“量子”到分子:探索计算的无限可能 | 综述荐读

在2023年年末,两篇划时代的研究报告在《科学》(Science)杂志上引发了广泛关注。这两篇论文分别来自两个研究小组,它们共同揭示了单氟化钙分子间相互作用的研究成果,成功地在这些分子间创造出了分子量子比特。这一成就不…

前端学习<四>JavaScript基础——03-常量和变量

常量(字面量):数字和字符串 常量也称之为“字面量”,是固定值,不可改变。看见什么,它就是什么。 常量有下面这几种: 数字常量(数值常量) 字符串常量 布尔常量 自定义…

图片改大小尺寸怎么改?几个修改图片尺寸的方法

日常生活和工作中,图片的大小和尺寸对于我们的工作和生活都至关重要,因此我们经常需要调整图片的大小。我们都知道压缩图是一款功能强大的图片在线处理工具,那么用它怎么调整图片大小呢?下面就让我们一起来看一下具体的操作步骤。…

Docker,anaconda环境的部署与迁移

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

Java对象Object对象头-MarkWord分析-hashCode

代码主要通过打印对象的内存布局来观察对象头在不同状态下的变化,进而分析对象头在不同情况下的内存布局情况。 System.out.println(ClassLayout.parseInstance(o).toPrintable());:这一行代码通过使用开源库 openjdk.jol 的 ClassLayout 类来解析对象 o…

备战蓝桥杯---贡献法刷题

话不多说,直接看题: 什么是贡献法?这是一种数学思想,就是看每一个元素对总和的贡献。 1. 我们可以先枚举区间再统计次数,但这显然TLE。我们可以发现,每一个孤独的区间对应一个孤独的牛,因此我…

MySQL 索引底层探索:为什么是B+树?

MySQL 索引底层探索:为什么是B树? 1. 由一个例子总结索引的特点2. 基于哈希表实现的哈希索引3. 高效的查找方式:二分查找4. 基于二分查找思想的二叉查找树5. 升级版的BST树:AVL 树6. 更加符合磁盘特征的B树7. 不断优化的B树&#…

Vulnhub:BOSSPLAYERSCTF: 1

目录 信息收集 arp nmap nikto whatweb WEB web信息收集 dirmap 命令执行漏洞 反弹shell 提权 系统信息收集 get root 信息收集 arp ┌──(root㉿ru)-[~/kali/vulnhub] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:50:56:2f:dd:9…

移动端WEB开发之响应式布局

一、响应式开发 1.1 响应式开发原理 就是使用媒体查询针对不同宽度的设备进行布局和样式的设置,从而适配不同设备的目的。 1.2 响应式布局容器 响应式需要一个父级做为布局容器,来配合子级元素来实现变化效果。原理就是在不同屏幕下,通过媒体…