如何在Node.JS中使用“ws”模块跟踪用户连接和断开WebSocket服务器?
我需要动态地添加和删除数组中的WebSocket,所以如果我需要向特定的WebSocket发送一些东西,我可以只执行clients.send('blah blah blah')
,
有什么办法可以做到这一点吗?我试过但失败了。这是我尝试过的
这是我的“客户模块”
clients = [];
function addClient(ws, wss, WebSocket) {
clients.push(ws);
console.log("Client Connect: " + clients.indexOf(ws) + ". " + clients.length + " Online")
ws.on('message', function incoming(data, isBinary) {
wss.clients.forEach(function each(client) {
if(client != ws && client.readyState == WebSocket.OPEN) {
const msg = isBinary ? data : data.toString();
client.send(msg);
}
})
})
ws.onclose = function() {
removeClient(ws);
}
}
function removeClient(ws) {
let indx = clients.indexOf(ws)
clients = clients.splice(clients.indexOf(ws), 1)
console.log("Client Disconnect: " + indx + ". " + clients.length + " Online")
}
module.exports = {
clients, addClient, removeClient
}
每当WebSocket服务器接收到“连接”时,就会调用addClient。这三个参数是:
- ws -WebSocket(客户端)
- wss -WebSocket服务器(我正在运行的代码)
- WebSocket -只是对WebSocket模块(“ws”)的引用
这段代码工作正常,但很容易出错。如果有人连接,列表会将WebSocket添加到客户端列表。如果有人断开连接,它有时会按预期删除它,而其他时候,它只是不这样做,并有一个“幽灵WebSocket”
我似乎找不到一个好方法来实现这一点,所以我只是寻求帮助。
当客户端连接时,将其添加到客户端列表中,以便我可以通过索引向其发送内容。
当客户端断开连接时,将其从列表中删除。
2条答案
按热度按时间oknrviil1#
经过更多的研究,我了解到您可以将任何属性或特性分配给
WebSocket
,这些属性或特性将贯穿整个生命周期。我只是简单地添加了一个计数器,当有人连接时,它永远不会下降和增加,并为该计数器设置了一个id属性。然后,我使用array.filter
过滤掉具有断开连接的WebSocket
所拥有的ID的客户端。代码如下:
dxxyhpgq2#
另一种方法是使用WebSocket服务器已经继承的
ping/pong
功能。A good article on how to do that can be found here。