节点 ws 包,单独连接到房间

node ws package, seperate connections into rooms

我正在尝试使用 npm 'ws' 包创建类似“房间”的功能,类似于房间在 socket.io 中的工作方式。我不想使用 socket.io,但无法弄清楚如何在不发送额外消息的情况下在连接时获取有关 user/room 的信息。

我从 ws 文档中获取了这个,它允许我遍历所有客户端,但我还想区分一个房间?

import WebSocket, { WebSocketServer } from 'ws';

const wss = new WebSocketServer({ port: 8080 });

wss.on('connection', function connection(ws) {
  // would like to add a user to a room here?
  ws.on('message', function message(data) {
    wss.clients.forEach(function each(client) {
      if (client !== ws && client.readyState === WebSocket.OPEN) {
        // only send to clients in the same room
      }
    });
  });
});

这是我一直用来测试的客户端:

import WebSocket from 'ws';

const ws = new WebSocket('ws://localhost:8080');

ws.on('open', function open() {
  ws.send(JSON.stringify({roomId: 1}));
});

ws.on('message', function message(data) {
  console.log('received: %s', data);
});

如果您想在连接处分配房间,请更改 url 的路径,然后通过 req 对象访问它,然后将其添加为 属性正在连接的 websocket。

然后您可以将roomId 与任何消息一起发送,并在发送前检查消息的roomId 和客户端的roomId 是否匹配。

wss.on('connection', function connection(ws, req) {
  ws.roomId = req.url;
  ws.on('message', function message(data) {
    const parsedMessage = JSON.parse(data);
    wss.clients.forEach(function each(client) {
      if (client !== ws && client.readyState === WebSocket.OPEN) {
        if(client.roomId === parsedMessage.roomId){
          ws.send(data);
        }
      }
    });
  });
});

为了连接到此套接字,您必须将客户端更改为发送到 url + roomId。

const ws = new WebSocket('ws://localhost:8080/<put room id here>');

在不发送第二条消息的情况下,这似乎获得了您正在寻找的功能