Node.js中如何操作WebSocket?

Node.js中操作WebSocket的核心是使用ws库创建服务器和客户端,通过事件驱动实现双向通信。首先安装ws库,创建HTTP服务器并绑定WebSocket服务器,监听connection事件处理客户端连接,利用message、close、error事件处理消息收发、连接关闭和错误。客户端通过new WebSocket()连接服务器,使用onopen、onmessage、onclose、onerror进行交互。数据传输通过send()发送,message事件接收,注意数据类型统一。错误处理需监听error事件,区分服务器与连接级错误;关闭事件通过close回调获取code和reason,判断关闭原因并执行重连或资源清理,确保应用健壮性。

node.js中如何操作websocket?

在Node.js中操作WebSocket,我们通常会借助成熟的第三方库,最流行且功能全面的当属

ws

库。它提供了一套简洁而强大的API,无论你是想搭建一个WebSocket服务器,还是构建一个WebSocket客户端,都能轻松实现实时双向通信。核心思路无非就是监听连接、处理消息、以及在适当时候关闭连接,这一切在Node.js异步非阻塞的特性下显得尤其高效。

Node.js中如何操作WebSocket,其核心在于利用

ws

这样的库来创建服务器实例,监听客户端连接请求,并在连接建立后,通过事件监听器处理消息的接收与发送。这包括了设置服务器端口、定义消息处理逻辑(如

on('message')

)、处理连接断开(

on('close')

)和错误(

on('error')

)等关键步骤。对于客户端,同样是创建WebSocket实例,指定服务器地址,然后通过类似的事件监听机制与服务器进行交互。

Node.js中搭建WebSocket服务器的基本步骤是什么?

说实话,第一次接触WebSocket的时候,总觉得它是个挺神秘的东西,毕竟和传统的HTTP请求/响应模式大相径庭。但当你真的上手用

ws

库在Node.js里搭起来,会发现它其实非常直观。我个人觉得,最关键的就是理解“事件驱动”这个核心。

搭建WebSocket服务器,首先你得安装

ws

库:

npm install ws

。然后,代码层面大致是这样的:

const WebSocket = require('ws');const http = require('http'); // WebSocket通常运行在HTTP服务器之上// 创建一个HTTP服务器,WebSocket服务器可以依附于它const server = http.createServer((req, res) => {  res.writeHead(200, { 'Content-Type': 'text/plain' });  res.end('WebSocket server is running.n');});// 创建WebSocket服务器实例,并绑定到HTTP服务器const wss = new WebSocket.Server({ server });wss.on('connection', ws => {  console.log('一个新的客户端连接了!');  ws.on('message', message => {    // 收到消息,这里可以做各种处理,比如广播给所有连接的客户端    console.log(`收到消息: ${message}`);    // 假设我们只是把收到的消息原封不动地发回去    ws.send(`服务器收到你的消息: ${message}`);  });  ws.on('close', () => {    console.log('一个客户端断开连接了。');  });  ws.on('error', error => {    console.error('WebSocket 错误:', error);  });  // 连接建立后,也可以主动向客户端发送消息  ws.send('欢迎连接到我的WebSocket服务器!');});// 启动HTTP服务器,监听端口const PORT = 8080;server.listen(PORT, () => {  console.log(`WebSocket服务器在 http://localhost:${PORT} 上运行`);});

这段代码里,我们先创建了一个普通的HTTP服务器,这并不是必须的,但很多时候WebSocket会和HTTP服务共用端口,或者WebSocket协议握手就是基于HTTP的。然后,我们把

WebSocket.Server

实例绑定到这个HTTP服务器上。

wss.on('connection', ...)

是关键,每当有新的客户端连接成功,这个回调函数就会被触发,并传入一个代表该客户端连接的

ws

对象。所有的消息收发、错误处理和连接关闭,都是围绕这个

ws

对象进行的。

如何在Node.js WebSocket客户端与服务器之间发送和接收数据?

客户端与服务器之间的数据交换,是WebSocket的核心价值所在。在我看来,它最大的魅力就是那种“实时性”和“双向性”,感觉就像是开了一条专线,想发就发,想收就收,不用像HTTP那样每次都得“请求-响应”走一套流程。

服务器端发送和接收数据:

在上面的服务器代码中,我们已经看到了接收数据和发送数据的例子。

接收数据: 通过

ws.on('message', message => { ... })

监听客户端发送过来的消息。

message

通常是Buffer类型,如果你发送的是文本,需要

message.toString()

来转换。发送数据: 通过

ws.send(data)

方法向特定的客户端发送数据。

data

可以是字符串、Buffer或ArrayBuffer。

客户端发送和接收数据:

客户端的逻辑与服务器端异曲同工,也是基于事件的。你可以用浏览器内置的

WebSocket

API,也可以在Node.js环境中使用

ws

库作为客户端。这里以Node.js客户端为例:

const WebSocket = require('ws');// 连接到服务器const ws = new WebSocket('ws://localhost:8080');ws.onopen = () => {  console.log('成功连接到WebSocket服务器。');  // 连接成功后,可以立即发送消息  ws.send('你好,服务器!我是客户端。');};ws.onmessage = event => {  // 收到服务器发送过来的消息  console.log(`收到服务器消息: ${event.data}`);  // 可以在收到特定消息后,再发送一条消息  if (event.data.includes('欢迎')) {    setTimeout(() => {      ws.send('服务器,我收到你的欢迎了!');    }, 1000);  }};ws.onerror = error => {  console.error('WebSocket客户端错误:', error);};ws.onclose = () => {  console.log('与服务器的连接已关闭。');};// 模拟一段时间后客户端主动关闭连接setTimeout(() => {  if (ws.readyState === WebSocket.OPEN) {    ws.close();    console.log('客户端主动关闭连接。');  }}, 5000);

这里需要注意

event.data

,它直接包含了服务器发送过来的数据。无论是服务器还是客户端,发送的数据类型最好保持一致,或者在接收端做好类型转换和解析工作,比如约定好都发送JSON字符串,然后

JSON.parse()

。这种数据格式的统一,是保证通信顺畅的关键。

Node.js WebSocket连接中如何处理错误和关闭事件?

处理错误和连接关闭,这绝对是构建任何健壮网络应用不可或缺的一环。在我做项目的时候,早期总是把重心放在“功能实现”上,而对异常处理考虑不足,结果线上环境一出问题就抓瞎。后来才明白,优雅地处理异常和关闭,才是区分一个玩具项目和生产级应用的标志。

错误处理 (

ws.on('error', ...)

):

无论是服务器还是客户端,

error

事件都至关重要。它会在网络问题、协议解析错误、或者其他底层错误发生时被触发。

在服务器端:

wss.on('connection', ws => {  // ... 其他事件监听 ...  ws.on('error', error => {    // 捕获特定客户端连接的错误    console.error('单个客户端连接错误:', error.message);    // 这里可以记录日志,或者尝试关闭这个有问题的连接    // ws.terminate(); // 强制关闭,不发送任何关闭帧  });});wss.on('error', error => {  // 捕获整个WebSocket服务器的错误,比如端口被占用等  console.error('WebSocket服务器全局错误:', error.message);  // 对于服务器全局错误,可能需要重启服务或者报警});

针对单个

ws

实例的错误,通常是该连接自身的问题。而

wss

(WebSocket服务器)实例上的错误,则可能是更全局性的问题,比如服务器启动失败。

在客户端:

ws.onerror = error => {  console.error('WebSocket客户端连接错误:', error);  // 客户端错误可能意味着连接失败、断开,或者数据传输问题  // 此时可以尝试重连,或者通知用户连接异常};

客户端的错误处理同样重要,它决定了你的应用在网络不稳定或服务器故障时,能否给出友好的提示或进行自动恢复。

关闭事件 (

ws.on('close', ...)

/

ws.onclose

):

连接的关闭是正常生命周期的一部分,但它也可能因为异常而发生。理解关闭事件的

code

reason

非常有用。

在服务器端:

wss.on('connection', ws => {  // ...  ws.on('close', (code, reason) => {    console.log(`客户端连接关闭。Code: ${code}, Reason: ${reason ? reason.toString() : '无'}`);    // code 是一个数字,表示关闭的原因,比如 1000 表示正常关闭    // reason 是一个可选的字符串,提供更多细节    // 可以在这里清理与该客户端相关的资源,比如从活跃连接列表中移除  });});

在客户端:

ws.onclose = event => {  console.log(`与服务器的连接已关闭。Code: ${event.code}, Reason: ${event.reason}`);  // event.code 和 event.reason 与服务器端类似  // 根据关闭码判断是否需要自动重连,例如:  if (event.code !== 1000) { // 1000是正常关闭    console.log('连接异常关闭,尝试重连...');    // setTimeout(() => { /* 重新创建WebSocket连接 */ }, 3000);  }};
code

有很多标准值,例如

1000

表示正常关闭,

1001

表示端点离开(比如浏览器页面关闭),

1006

表示异常关闭(无关闭帧)。通过判断这些

code

,我们可以更智能地处理连接断开后的逻辑,比如是否进行重连,或者记录日志进行分析。这种细节的处理,往往能大大提升应用的鲁棒性。

以上就是Node.js中如何操作WebSocket?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1518484.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
如何调试性能瓶颈问题?
上一篇 2025年12月20日 11:36:23
如何配置JS容灾方案?
下一篇 2025年12月20日 11:36:37

相关推荐

  • UC浏览器缓存清理失败怎么办 UC浏览器缓存管理优化方法

    先检查权限和存储空间,再用手机自带工具清理缓存文件夹,最后更新或重装UC浏览器解决清理失败问题。 UC浏览器缓存清理失败,通常不是按钮没反应,就是空间没释放。问题可能出在系统权限、文件顽固或设置冲突上。别急着重装,先试试这几个方法,基本能搞定。 检查应用权限与存储状态 如果UC浏览器自己都“进不去”…

    2026年9月21日
    000
  • mysql如何排查排序异常

    排查MySQL排序异常需先确认ORDER BY是否生效,检查子查询、UNION及应用层逻辑是否覆盖排序;通过EXPLAIN分析是否使用索引排序,避免Using filesort;确保字段类型、字符集和排序规则(collation)符合预期,处理NULL值和大小写敏感性;关注sort_buffer_s…

    2026年9月21日
    000
  • 即梦AI运镜控制怎么控制_即梦AI视频镜头移动技巧详解

    掌握即梦AI运镜需四步:一、用“镜头缓慢推进”等预设提示词生成标准运动;二、通过动效画板框选主体并绘制运动路径;三、设置首尾帧引导转场,实现穿越或循环效果;四、结合“希区柯克式变焦”“时间冻结环绕”等高级技巧增强视觉表现。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 Dee…

    2026年9月21日
    000
  • 三星电视携手京东开启艺术视听盛典以科技美学重塑家居生活新模式

    三星电视携手京东开启艺术视听盛典以科技美学重塑家居生活新模式三星电视携手京东开启艺术视听盛典以科技美学重塑家居生活新模式三星电视携手京东开启艺术视听盛典以科技美学重塑家居生活新模式三星电视携手京东开启艺术视听盛典以科技美学重塑家居生活新模式

    随着消费理念升级与需求日益多样化,电视已不再仅仅是观看节目和影音娱乐的工具,而是逐渐演变为承载家居美学、传递情感温度、连接智慧生活的艺术载体。在这一变革浪潮中,三星率先引领艺术电视领域的创新风向,theframe画壁艺术电视与theserif画境艺术电视成功打破科技与艺术之间的界限,将电视升华为可观…

    2026年9月21日 用户投稿
    100
  • 如何在Weka中处理向量属性:ARFF格式的限制与解决方案

    本文探讨了weka中arff格式对直接向量属性表示的限制,并提供了两种主要解决方案。对于时间序列数据,建议利用weka的内置时间序列分析功能。对于非时间序列数据,核心在于通过特征工程(如使用addexpression、multifilter等)将向量拆解并转换为可被weka有效处理的独立特征,以揭示…

    2026年9月21日
    000
  • 哪些Docker扩展能让你在VSCode内轻松管理容器?

    Docker官方扩展是VSCode中管理容器的核心工具,提供容器、镜像、卷、网络的可视化操作,结合Remote-Containers可实现容器内开发,辅以YAML、GitLens等扩展提升效率,需确保本地Docker daemon运行。 在 VSCode 中管理 Docker 容器,最核心的扩展是 …

    2026年9月21日
    000
  • Flyway配置中安全使用环境变量的实践指南

    flyway配置中直接暴露数据库连接参数存在安全隐患。本文详细阐述了如何通过命令行参数和api调用两种主要方式,将环境变量安全地集成到flyway配置流程中。通过外部化管理敏感信息,可以有效提升数据库迁移配置的安全性、灵活性和可维护性,避免将凭证硬编码到配置文件中。 在数据库迁移实践中,将敏感的数据…

    2026年9月21日
    100
  • UC浏览器自带的截图功能快捷键是什么 UC浏览器内置截图快捷键使用说明

    首先通过快捷键或图标触发截图,再选择区域完成截取。UC浏览器支持三种方式:1. 使用Ctrl+Shift+X(Windows)或Command+Shift+X(Mac)快捷键截图;2. 点击地址栏右侧剪刀图标进行全屏、可见区域或自定义截图;3. 在设置中启用手势控制,使用三指下滑手势快速截图。所有截…

    2026年9月21日
    000
  • 如何用SumoPaint的AI裁剪图片?快速完成智能图片裁剪教程

    如何用SumoPaint的AI裁剪图片?快速完成智能图片裁剪教程如何用SumoPaint的AI裁剪图片?快速完成智能图片裁剪教程如何用SumoPaint的AI裁剪图片?快速完成智能图片裁剪教程如何用SumoPaint的AI裁剪图片?快速完成智能图片裁剪教程

    答案:SumoPaint虽无AI裁剪功能,但可通过魔棒、套索工具精确选区,结合图层蒙版与羽化、反选等操作实现智能裁剪效果,最后按需导出PNG或JPG高质量文件。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 在SumoPaint中,虽然它不…

    2026年9月21日 用户投稿
    100
  • Java OOP如何使用内部类提高代码组织性

    内部类提升Java代码组织性与封装性,成员内部类增强封装,静态内部类分离逻辑,局部与匿名内部类简化回调,私有内部类隐藏实现细节。 内部类在Java面向对象编程中是一种有效提升代码组织性和封装性的工具。通过将一个类定义在另一个类的内部,可以更好地表达类之间的逻辑关系,控制访问权限,并减少命名冲突。合理…

    2026年9月21日
    000
  • VSCode中竖线怎么设置_VSCode编辑区竖线(标尺)显示与配置教程

    在VSCode中启用垂直标尺需修改settings.json文件中的editor.rulers属性,如设置{ “editor.rulers”: [80, 120] }可在第80和120列显示竖线,提升代码对齐与可读性;虽原生不支持自定义颜色样式,但可通过安装Guides或In…

    2026年9月21日
    100
  • PHP 数组值比较与嵌套数组过滤教程

    本教程详细讲解如何在 PHP 中比较一个简单数组与一个复杂嵌套数组,并根据特定条件(如文件名匹配)过滤嵌套数组中的所有相关子数组。我们将通过识别非匹配项的索引,然后从所有子数组中移除这些项并重新索引,实现精确的数据筛选。 问题背景 在 php 开发中,我们经常会遇到需要处理结构复杂的数组数据。例如,…

    2026年9月21日
    100
  • 漫番漫画官方网页_ 漫番漫画在线访问入口

    漫番漫画官方网页入口为https://manwa.me,该平台汇聚多类型漫画资源,界面简洁、更新稳定,支持网页端流畅阅读;采用动态域名与镜像站点保障访问连续性,配备HTTPS加密提升安全性;提供个性化阅读设置、书架收藏及评论互动功能,优化用户体验。 漫番漫画官方网页入口地址在哪里?这是不少网友都关注…

    2026年9月21日
    200
  • Chrome浏览器怎么开启数据同步功能_Chrome浏览器跨设备数据同步设置教程

    首先登录Google账户启用Chrome同步功能,确保书签、历史记录、密码等数据跨设备一致;接着在设置中自定义同步内容类型以满足隐私需求;然后通过Google账户密钥或自定义密码加密同步数据,提升安全性;最后在新设备登录同一账户,自动接收已同步的浏览数据,实现无缝体验。 如果您希望在不同设备间无缝使…

    2026年9月21日
    000
  • 如何使用XGBoost训练AI大模型?优化机器学习模型的步骤

    XGBoost并非用于训练GPT类大模型,而是擅长处理结构化数据的高效梯度提升算法,其优势在于速度快、准确性高、支持并行计算、内置正则化与缺失值处理,适用于表格数据建模;通过分阶段超参数调优(如学习率、树深度、采样策略)、结合贝叶斯优化与交叉验证,并配合特征工程、数据预处理和集成学习等关键步骤,可显…

    2026年9月21日
    000
  • VSCode代码编辑器在线使用_VSCode网页版免安装直接进入编辑

    答案:无需安装即可在浏览器使用VSCode,主要方式包括GitHub Codespaces、Gitpod、StackBlitz、CodeSandbox和自托管code-server,适用于不同场景,如GitHub集成、前端开发或完全控制环境;但存在网络依赖、性能限制、插件兼容性、文件访问和安全等局限…

    2026年9月21日
    100
  • VSCode远程开发:配置容器与SSH连接的最佳实践解析

    使用VSCode远程开发提升效率,通过Remote-Containers和Remote-SSH实现环境标准化。1. 配置.devcontainer文件夹,用devcontainer.json定义容器环境,推荐自定义Dockerfile并预装工具;2. SSH连接需配置公钥认证、~/.ssh/conf…

    2026年9月21日
    100
  • 美图秀秀导出视频卡住 美图视频保存失败修复方案

    导出视频卡住或保存失败,通常和设备性能、软件状态或操作方式有关。直接强制退出再尝试是很多人会做的,但更有效的是先排查具体原因。 检查设备资源与软件状态 导出视频是个高负载任务,容易因资源不足中断。 关闭后台应用:尤其是浏览器、游戏或其他大型程序,释放内存和处理器资源。 确认存储空间:确保手机或电脑有…

    2026年9月21日
    000
  • 谷歌浏览器新建窗口无法继承上次会话标签如何解决

    谷歌浏览器新建窗口无法继承上次会话标签如何解决谷歌浏览器新建窗口无法继承上次会话标签如何解决谷歌浏览器新建窗口无法继承上次会话标签如何解决谷歌浏览器新建窗口无法继承上次会话标签如何解决

    答案是检查“启动时”设置并确保选择“继续上次会话”。具体操作为:打开谷歌浏览器设置→启动时→选择“继续上次会话”;新建窗口默认不继承标签页属正常设计,可通过拖拽标签或使用扩展解决;若问题仍存,可检查策略、禁用扩展或重置设置。 谷歌浏览器新建窗口无法继承上次会话的标签页,通常是因为设置未开启或某些配置…

    2026年9月21日 用户投稿
    000
  • VSCode怎么运行全部代码_VSCode批量执行代码教程

    在VSCode里“运行全部代码”或“批量执行代码”,其实很少是一个单一的、所有语言通用的按钮。它更多的是指根据你项目的具体需求,通过配置任务(Tasks)、使用集成终端(Integrated Terminal)配合脚本,或者利用特定语言的运行/调试配置(Launch Configurations)来…

    2026年9月21日
    100

发表回复

登录后才能评论
关注微信