【问题标题】:Emit to socket with a particular object attribute发射到具有特定对象属性的套接字
【发布时间】:2014-11-06 04:15:09
【问题描述】:

我将username 添加到这样的套接字对象中,它工作正常

socket.on('add user', function (username) {
    socket.username = username;
});

让我们假设username 是khawer,现在我想发射到username 是khawer 的这个套接字,但我不能这样做。

我试过了

io.sockets.connected[socket.username].emit('chat message', msg);

还有这个

io.sockets.sockets[socket.username].emit('chat message', msg);

但两者都不起作用。我在这里做错了什么?

【问题讨论】:

  • 我认为你应该使用套接字 ID 而不是用户名io.sockets.connected[SomeSocketID].emit(...)
  • 是的,这行得通。由于socket.id 是套接字对象的索引,那么为什么socket.username 不是索引?
  • socket.username 是您自己的财产。套接字库对它没有任何作用。如果您想按该属性建立索引,则必须创建自己的索引。
  • 我认为这是socket.io的一个缺点。它只有 socket.id 用于索引
  • @Paramore - 用户名是您自己的发明,而不是与 socket.io 有任何关系的属性。如果你想要一个你发明的东西的索引,那么你就创建你自己的索引。我在下面的答案中添加了几种可能的解决方案。

标签: node.js sockets socket.io


【解决方案1】:

仅将 username 属性分配给套接字并不能使其按名称索引 - 因此您无法执行正在执行的任何类型的查找。

如果您想按用户名查找套接字,则必须对所有套接字进行暴力搜索以找到具有相同用户名的套接字,或者您必须按名称创建自己的套接字索引.


如果你想通过蛮力查找来找到它,你可以这样做:

var list = io.sockets.sockets;
for (var i = 0; i < list.length; i++) {
    if (list[i].username === "khawer") {
        list[i].emit('chat message', msg);
    }
}

您还可以将每个用户放入一个名称与其用户名匹配的聊天室。然后,您可以通过简单地通过该名称发送到聊天室来发送到任何给定的用户名。您将使用聊天室功能作为用户名的索引。当他们连接时,只需一个额外的步骤即可将套接字放入与他们的用户名匹配的聊天室。


或者,每次套接字连接和断开时,您可以通过用户名维护自己的套接字索引(这比较常见)。

【讨论】:

    猜你喜欢
    • 2017-07-07
    • 2018-03-03
    • 1970-01-01
    • 2010-10-02
    • 1970-01-01
    • 1970-01-01
    • 2020-06-18
    • 2016-12-17
    • 2020-11-16
    相关资源
    最近更新 更多