【问题标题】:Can I simply and efficiently check whether a Socket.io client ID is taken?我可以简单有效地检查一个 Socket.io 客户端 ID 是否被占用吗?
【发布时间】:2015-12-14 21:23:25
【问题描述】:

我想使用 Socket.io 中的客户端 ID 作为用户通过输入连接到彼此会话的代码。创建者的套接字 id 成为会话代码。

所以我想将 id 更改为更短的随机字符串,我现在知道该怎么做,但我需要检查我的随机字符串以确保它不是与另一个连接的客户端的 id 重复。

是的,我可以这样做(未经测试):

function generate(){
    var randomStr = generateRandom(6);
    var clients = io.sockets.clients();
    var unique = true;
    for (client in clients) {
        if (clients.hasOwnProperty(client) {
           if (randomStr == client.id) unique = false;
        }
    }
    if (unique) client.id = randomStr;
    else generate();
}

但这需要一个循环,它没有像我理解的 JavaScript 在内部检查对象属性时那样利用哈希表,这将消除所有客户端的循环:

function generate(){
    var randomStr = generateRandom(6);
    var clients = io.sockets.clients();
    if (!clients[randomStr]) client.id = randomStr;
    else generate();
}

有没有办法以类似的方式有效地检查客户的现有 ID?

当我转换客户端 ID 时,我可以将 ID 应用于对象,但我想确保没有一种简单的方法可以在不添加更多代码的情况下进行有效检查(每次客户端连接时更新对象)。

【问题讨论】:

  • 你的第二个generate 方法应该可以解决问题。
  • @nem 真的吗??我没有意识到该对象是由 ID 键入的,好吧,太好了。我应该删除它吗?
  • 抱歉,我正在编辑你的代码不完整,现在我意识到这是故意的。然后查看 @DanielKobe 的 答案,这似乎正是您想要的。

标签: javascript socket.io


【解决方案1】:

在 socket io ≥ 1.0 中你可以使用io.sockets.connected[socketid]。您可以使用它来更新您的生成功能。

function generate(client_to_update){
    var randomStr = generateRandom(6);
    var client = io.sockets.connected[randomStr];
    if (!client) client_to_update.id = randomStr;
    else generate(client_to_update);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-14
    • 1970-01-01
    • 2012-12-26
    • 1970-01-01
    • 1970-01-01
    • 2014-12-07
    • 2014-10-28
    • 2013-12-04
    相关资源
    最近更新 更多