ws 库:用于 Node.js 的 WebSocket
ws 库是 Node.js 的一个简单、快速且经过全面测试的 WebSocket 协议实现。它是在服务器端 JavaScript 中创建实时应用程序(聊天、在线游戏、通知、协同编辑)的事实标准。与内置的 http 模块不同,ws 在客户端和服务器之间提供完整的双向通信,无需持续的 HTTP 请求。
主要特性
- 完全支持 RFC 6455 协议 — 适用于所有现代浏览器。
- 高性能 — 内存占用低,延迟小。
- 简单的 API — 只需几行代码即可创建服务器和客户端。
- 支持扩展 — 数据压缩 (permessage-deflate)。
- 与 HTTP 服务器集成 — 可以与 Express 或其他框架共享端口。
- 自动重连 — 客户端内置机制。
安装
通过 npm 安装:
npm install ws安装后,库即可使用。
创建 WebSocket 服务器
创建一个简单的服务器,接受连接并发送欢迎消息:
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });
wss.on('connection', function connection(ws) { console.log('新客户端已连接');
// 向客户端发送消息 ws.send('欢迎来到 WebSocket 服务器!');
// 处理传入消息 ws.on('message', function incoming(message) { console.log('收到: %s', message); // 发送回去(回声) ws.send('回声: ' + message); });
// 处理连接关闭 ws.on('close', function() { console.log('客户端已断开连接'); });});
console.log('WebSocket 服务器已启动在 ws://localhost:8080');创建 WebSocket 客户端
客户端连接到服务器,发送消息并接收响应:
const WebSocket = require('ws');
const ws = new WebSocket('ws://localhost:8080');
ws.on('open', function open() { console.log('连接已建立'); ws.send('你好,服务器!');});
ws.on('message', function incoming(data) { console.log('服务器响应: %s', data); ws.close();});
ws.on('close', function() { console.log('连接已关闭');});
ws.on('error', function error(err) { console.error('错误:', err.message);});使用 JSON 和多客户端
一个实际的例子——一个向所有连接的客户端广播消息的聊天服务器:
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });
wss.on('connection', function connection(ws, req) { console.log('客户端已连接。总客户端数:', wss.clients.size);
ws.on('message', function incoming(message) { // 解析 JSON let data; try { data = JSON.parse(message); } catch (e) { ws.send(JSON.stringify({ error: '无效的 JSON' })); return; }
// 向除发送者之外的所有人广播 wss.clients.forEach(function each(client) { if (client !== ws && client.readyState === WebSocket.OPEN) { client.send(JSON.stringify({ username: data.username, text: data.text, timestamp: Date.now() })); } }); });
ws.send(JSON.stringify({ system: '欢迎来到聊天室!' }));});客户端可以发送 JSON:
ws.send(JSON.stringify({ username: '爱丽丝', text: '大家好!' }));