节点 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>');
在不发送第二条消息的情况下,这似乎获得了您正在寻找的功能
我正在尝试使用 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>');
在不发送第二条消息的情况下,这似乎获得了您正在寻找的功能