用 Node.js 手写 WebSocket 协议
发布人:shili8
发布时间:2025-02-15 07:47
阅读次数:0
**Node.js 中的手写 WebSocket 协议**
WebSocket 是一种在客户端和服务器之间进行实时通信的协议。它允许双方在连接建立后,通过 TCP 连接进行双向数据传输。下面我们将手写一个简单的 WebSocket服务器和客户端。
### WebSocket 协议概述WebSocket 协议基于 TCP 协议,使用 HTTP 升级来建立连接。升级过程中,客户端和服务器之间会交换一些元数据,以便双方可以确定是否支持 WebSocket 协议。
**WebSocket 协议握手过程**
1. 客户端发送一个 HTTP 请求到服务器,请求 URL 为 `/ws`,方法为 `GET` 或 `WS`,头部中包含 `Upgrade: websocket` 和 `Connection: Upgrade` 等关键信息。
2.服务器接收到客户端的请求后,如果支持 WebSocket 协议,则会返回一个 HTTP 响应,状态码为101 Switching Protocols,表示协议升级成功。响应头部中包含 `Upgrade: websocket` 和 `Connection: Upgrade` 等关键信息。
3. 双方完成握手过程后,可以通过 TCP 连接进行双向数据传输。
### Node.js 中的 WebSocket服务器下面是使用 Node.js 手写一个简单的 WebSocket服务器的示例代码:
javascriptconst http = require(' />const WebSocket = require('ws');
// 创建 HTTP服务器const server = res) => {
// 如果请求 URL 为 /ws,则升级为 WebSocket 协议 if (req.url === '/ws') {
res.writeHead(101, { 'Upgrade': 'websocket', 'Connection': 'Upgrade' });
res.end();
} else {
res.writeHead(404);
res.end('Not Found');
}
});
// 创建 WebSocket服务器const wss = new WebSocket.Server({ server });
// 监听 WebSocket 连接事件wss.on('connection', (ws) => {
console.log('客户端连接成功');
// 监听 WebSocket 消息事件 ws.on('message', (message) => {
console.log(`收到消息:${message}`);
// 回复消息给客户端 ws.send(message);
});
// 监听 WebSocket 错误事件 ws.on('error', (error) => {
console.error('WebSocket 错误:', error);
});
// 监听 WebSocket 关闭事件 ws.on('close', () => {
console.log('客户端连接关闭');
});
});
// 启动 HTTP服务器server.listen(3000, () => {
console.log('HTTP服务器启动成功,监听端口:3000');
});
### Node.js 中的 WebSocket 客户端下面是使用 Node.js 手写一个简单的 WebSocket 客户端的示例代码:
javascriptconst WebSocket = require('ws');
// 创建 WebSocket 连接const ws = new WebSocket('ws://localhost:3000/ws');
// 监听 WebSocket 连接事件ws.on('open', () => {
console.log('连接服务器成功');
});
// 监听 WebSocket 消息事件ws.on('message', (message) => {
console.log(`收到消息:${message}`);
});
// 监听 WebSocket 错误事件ws.on('error', (error) => {
console.error('WebSocket 错误:', error);
});
// 监听 WebSocket 关闭事件ws.on('close', () => {
console.log('连接服务器关闭');
});
// 发送消息给服务器ws.send('Hello, Server!');
上述示例代码中,我们使用 Node.js 的 ` 和 `ws` 模块分别创建了一个 HTTP服务器和 WebSocket服务器。客户端通过 WebSocket 连接向服务器发送消息,并监听服务器回复的消息。
**注意事项**
* 在生产环境中,建议使用成熟的 WebSocket 库,如 `ws` 或 `uWebSockets` 等。
* WebSocket 协议握手过程中,需要正确处理 HTTP 升级和 TCP 连接建立等细节。
* WebSocket 客户端和服务器之间的通信可能会受到网络延迟、丢包等问题的影响。
通过上述示例代码,我们可以看到 Node.js 中的手写 WebSocket服务器和客户端是相对简单的。然而,在实际应用中,需要考虑到协议握手过程中的细节以及网络环境的复杂性。

