Bootstrap

实现 WebSocket 服务端

在 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 模块也可以让多进程部署变得更加容易。需要注意的是,在实际应用中,需要根据服务器的资源情况和负载量来配置工作进程数,以达到最佳的性能和稳定性。

;