我正在嘗試使用 npm 'ws' 包創建類似“房間”的功能,類似于房間在 socket.io 中的作業方式。我不想使用 socket.io,但不知道如何在不發送額外訊息的情況下在連接時獲取有關用戶/房間的資訊。
我從 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);
});
uj5u.com熱心網友回復:
如果您想在連接時分配一個房間,您可以更改 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>');
在不發送第二條訊息的情況下,這似乎可以獲得您正在尋找的功能
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/428550.html
上一篇:為字串陣列反應鍵
