在 Node.js 中实现 WebSocket 服务端,可以使用 ws
库。ws
是一个简单易用的 WebSocket 模块,提供了 WebSocket Server 和 WebSocket Client 的实现。
以下是使用 ws
库创建 WebSocket 服务端的示例代码:
const WebSocket = require('ws');
// 创建 WebSocket 服务器
const wss = new WebSocket.Server({ port: 8080 });
// 监听客户端连接事件
wss.on('connection', (ws) => {
console.log('client connected');
// 监听客户端消息事件
ws.on('message', (message) => {
console.log(`received: ${message}`);
// 将消息广播给所有客户端
wss.clients.forEach((client) => {
if (client !== ws && client.readyState === WebSocket.OPEN) {
client.send(message);
}
});
});
// 监听客户端断开事件
ws.on('close', () => {
console.log('client disconnected');
});
});
以上示例代码创建了一个 WebSocket 服务器,并监听客户端连接、消息、断开等事件。当客户端发送消息时,服务器会将该消息广播给所有已连接的客户端。
需要注意的是,WebSocket 服务器不同于传统的 HTTP 服务器,它需要在长时间保持连接的情况下运行。因此,在实际应用中,需要考虑到服务器的稳定性和扩展性,并对服务器进行相应的优化配置。
同时,为了能够处理更多连接和高并发请求,可结合 Node.js 的 Cluster 模块或使用 PM2 进行 WebSocket 服务器的集群化部署。
const cluster = require('cluster');
const numCPUs = require('os').cpus().length;
const WebSocket = require('ws');
if (cluster.isMaster) {
// 创建工作进程
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
// 监听工作进程退出事件
cluster.on('exit', (worker, code, signal) => {
console.log(`worker ${worker.process.pid} died`);
cluster.fork();
});
} else {
// 创建 WebSocket 服务器
const wss = new WebSocket.Server({ port: 8080 });
// 监听客户端连接事件
wss.on('connection', (ws) => {
console.log('client connected');
// 监听客户端消息事件
ws.on('message', (message) => {
console.log(`received: ${message}`);
// 将消息广播给所有客户端
wss.clients.forEach((client) => {
if (client !== ws && client.readyState === WebSocket.OPEN) {
client.send(message);
}
});
});
// 监听客户端断开事件
ws.on('close', () => {
console.log('client disconnected');
});
});
}
相比于单进程部署,多进程部署可以在一定程度上提高服务器的性能和稳定性,同时使用 Cluster 模块也可以让多进程部署变得更加容易。需要注意的是,在实际应用中,需要根据服务器的资源情况和负载量来配置工作进程数,以达到最佳的性能和稳定性。