如何获得客户ID?

时间:2018-07-27 17:09:02

标签: node.js websocket

我正在使用ws库,并且希望像这样进行私人聊天:客户端A向客户端B发送消息。
我有一种ws.clients.forEach()方法可以广播给每个客户端,但是如何获取单个客户端的客户端ID?

1 个答案:

答案 0 :(得分:0)

设置聊天系统并且userA要与userB聊天时,必须具有一个标识符,以便userA用户告诉服务器他们希望与userB聊天。如果ws库没有为每个连接的用户提供易于使用的标识符,那么您需要在用户连接到服务器时分配一个标识符,然后以一种可以找到的方式跟踪每个连接的标识符具有给定ID的套接字。一种简单的方法是只创建一个Map对象,其中key是ID,而value是套接字。然后,您可以按ID查找任何套接字。

例如,您可以为每个传入的套接字连接创建唯一的ID,并按以下方式存储它:

const uuid = require("uuid/v4");

const wss = new WebSocket.Server({ port: 8080 });
const idMap = new Map();

wss.on('connection', function connection(ws) {
    // create uuid and add to the idMap
    ws.uuid = uuid();
    idMap.add(ws.uuid, ws);

    ws.on('close', function() {
        // remove from the map
        idMap.delete(ws.uuid);
    });

    ws.on('message', function(info) {
        try {
            info = JSON.parse(info);
            if (info.action = "send") {
                let dest = idMap.get(info.targetId);
                if (dest) {
                    dest.send(JSON.stringify({action: "message", sender: ws.uuid, data: info.message}));
                }
            }
        } catch(e) {
            console.log("Error processing incoming message", e);
        }
    });
});

然后,您可以在内部使用该uuid值来标识某人想要连接或发送到的用户。

在大多数实际应用程序中,您还将创建某种登录名和用户名。唯一的用户名也可以用作ID。