Node.js 的 WebSocket 库:ws、Socket.IO 和 µWebSockets
WebSocket 是一种协议,可在客户端和服务器之间提供持久的双向连接。在 Node.js 生态系统中,有多个流行的库实现了此协议。在本文中,我们将介绍三个主要的库:ws、Socket.IO 和 µWebSockets (uWS)。您将了解如何安装它们、编写一个简单的聊天服务器,并为您的任务选择合适的工具。
1. ws 库 — 轻量且高性能
ws 是 Node.js 中最流行且最快的 WebSocket 库。它实现了纯粹的 WebSocket 协议,没有额外的附加功能,从而带来最小的开销和最高的速度。
安装
npm install ws示例:回声服务器
const WebSocket = require('ws');
const server = new WebSocket.Server({ port: 8080 });
server.on('connection', (ws) => { console.log('客户端已连接');
ws.on('message', (message) => { console.log(`收到: ${message}`); ws.send(`回声: ${message}`); });
ws.on('close', () => { console.log('客户端已断开连接'); });});
console.log('WebSocket 服务器已启动在 ws://localhost:8080');客户端部分(浏览器)
const socket = new WebSocket('ws://localhost:8080');
socket.onopen = () => { console.log('连接已建立'); socket.send('你好,服务器!');};
socket.onmessage = (event) => { console.log('来自服务器的响应:', event.data);};
socket.onerror = (error) => { console.error('WebSocket 错误:', error);};ws 的特点:
- 性能:在吞吐量测试中,比 Socket.IO 快 2-3 倍。
- 极简主义:没有内置的自动重连、房间或回退传输机制。
- 支持:完全兼容 RFC 6455。
- 用途:非常适合对速度要求苛刻的实时应用程序(股票数据、游戏、高负载聊天)。
2. Socket.IO — 生产环境的便利性和可靠性
Socket.IO 不仅仅是一个 WebSocket 库,而是一个用于实时应用程序的完整框架。它在 WebSocket 之上增加了:自动重连、房间、命名空间、回退到长轮询(如果 WebSocket 不受支持)以及便捷的 API。
安装
npm install socket.io示例:简单的聊天服务器
const http = require('http');const { Server } = require('socket.io');
const server = http.createServer();const io = new Server(server, { cors: { origin: '*' }});
io.on('connection', (socket) => { console.log(`用户已连接:${socket.id}`);
socket.on('chat message', (msg) => { console.log(`消息:${msg}`); io.emit('chat message', msg); // 广播给所有人 });
socket.on('disconnect', () => { console.log(`用户已断开连接:${socket.id}`); });});
server.listen(3000, () => { console.log('Socket.IO 服务器在 http://localhost:3000');});客户端部分(浏览器)
<script src="/socket.io/socket.io.js"></script><script> const socket = io('http://localhost:3000');
socket.on('connect', () => { console.log('已连接到服务器'); socket.emit('chat message', '大家好!'); });
socket.on('chat message', (msg) => { const item = document.createElement('li'); item.textContent = msg; document.getElementById('messages').appendChild(item); });</script>Socket.IO 的特点:
- 自动重连:当连接断开时,客户端会自动尝试恢复连接。
图书馆中也有
推荐