Node.js 的 WebSocket 库:ws、Socket.IO、uWS — 全面概述

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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 的特点:

推荐