如何在Node.js WebSocket Server中跟踪客户端的连接和断开?

0vvn1miw  于 2023-10-20  发布在  Node.js
关注(0)|答案(2)|浏览(307)

如何在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”
我似乎找不到一个好方法来实现这一点,所以我只是寻求帮助。
当客户端连接时,将其添加到客户端列表中,以便我可以通过索引向其发送内容。
当客户端断开连接时,将其从列表中删除。

oknrviil

oknrviil1#

经过更多的研究,我了解到您可以将任何属性或特性分配给WebSocket,这些属性或特性将贯穿整个生命周期。我只是简单地添加了一个计数器,当有人连接时,它永远不会下降和增加,并为该计数器设置了一个id属性。然后,我使用array.filter过滤掉具有断开连接的WebSocket所拥有的ID的客户端。
代码如下:

clients = [];
aid = 0;

function addClient(ws, wss, WebSocket) {
    ws.userid = aid;
    aid+=1;
    clients.push(ws)

    console.log("Client Connect: " + ws.userid + ". " + 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) {
    clients = clients.filter((check) => {
        return check.userid != ws.userid
    })
    console.log("Client Disconnect: " + ws.userid + ". " + clients.length + " Online")
}

module.exports = {
    clients, addClient, removeClient
}
dxxyhpgq

dxxyhpgq2#

另一种方法是使用WebSocket服务器已经继承的ping/pong功能。A good article on how to do that can be found here

相关问题