WebSocket 库 TypeScript:ws 和 Socket.IO
WebSocket 是一种协议,可在客户端和服务器之间实现实时双向通信。在 TypeScript/Node.js 生态系统中,最流行的 WebSocket 库是 ws(轻量级)和 Socket.IO(具有额外功能)。在本文中,我们将详细介绍这两个库的安装、基本用法以及 TypeScript 代码示例。
1. ws 库
ws 是一个用于 Node.js 的极简且快速的 WebSocket 库,与 TypeScript 完全兼容。它提供了纯粹的 WebSocket API,没有多余的抽象。
安装
npm install wsnpm install -D @types/ws在 TypeScript 中创建 WebSocket 服务器
import { WebSocketServer, WebSocket } from 'ws';
const wss = new WebSocketServer({ port: 8080 });
wss.on('connection', (ws: WebSocket) => { console.log('客户端已连接');
// 向客户端发送消息 ws.send('欢迎!');
// 处理传入消息 ws.on('message', (data: Buffer) => { const message = data.toString(); console.log(`收到:${message}`);
// 向所有已连接的客户端发送响应 wss.clients.forEach((client) => { if (client.readyState === WebSocket.OPEN) { client.send(`回声:${message}`); } }); });
// 处理连接关闭 ws.on('close', () => { console.log('客户端已断开'); });});
console.log('WebSocket 服务器已启动,端口 8080');TypeScript 客户端代码
const ws = new WebSocket('ws://localhost:8080');
ws.onopen = () => { console.log('连接已建立'); ws.send('你好,服务器!');};
ws.onmessage = (event: MessageEvent) => { console.log(`服务器响应:${event.data}`);};
ws.onclose = () => { console.log('连接已关闭');};2. Socket.IO 库
Socket.IO 是一个构建在 WebSocket 之上的更高级库。它增加了:
- 连接断开时的自动重连
- 支持房间和命名空间(namespaces)
- 回退机制(如果 WebSocket 不可用,则切换到 HTTP long-polling)
- 内置事件支持(events)
安装
npm install socket.io socket.io-clientnpm install -D @types/socket.io @types/socket.io-client使用 Socket.IO 的 TypeScript 服务器
import { Server } from 'socket.io';import http from 'http';
const server = http.createServer();const io = new Server(server, { cors: { origin: '*', methods: ['GET', 'POST'] }});
io.on('connection', (socket) => { console.log(`用户已连接:${socket.id}`);
// 加入房间 socket.on('join_room', (room: string) => { socket.join(room); console.log(`Socket ${socket.id} 已加入房间 ${room}`); });
// 处理自定义事件 socket.on('chat_message', (data: { room: string; message: string }) => { // 向房间内除发送者外的所有人发送消息 socket.to(data.room).emit('chat_message', { userId: socket.id, message: data.message }); });
socket.on('disconnect', () => { console.log(`用户已断开:${socket.id}`); });});
server.listen(3000, () => { console.log('Socket.IO 服务器已启动,端口 3000');});使用 Socket.IO 的 TypeScript 客户端
import { io, Socket } from 'socket.io-client';
const socket: Socket = io('http://localhost:3000');
socket.on('connect', () => { console.log('已连接到服务器');
// 加入房间 socket.emit('join_room', 'room_1');});
socket.on('chat_message', (data: { us