Socket IO 发送到指定的用户 ID

Posted

技术标签:

【中文标题】Socket IO 发送到指定的用户 ID【英文标题】:Socket IO send to specified user ID 【发布时间】:2012-02-26 14:46:21 【问题描述】:

我想向指定的用户发送数据,而不是其他人。

目前向我做的所有人广播:

socket.on('newChatMessage', function (message) 
socket.broadcast.emit('newChatMessage_response',  data: message);
);

现在我想做的只是:

socket.on('newChatMessage', function (message) 
socket.to(5).send('newChatMessage_response',  data: message);
);

to(5) 将是 ID 为 5 的用户。

【问题讨论】:

【参考方案1】:

我认为您缺少的部分在此函数中:io.sockets.on('connection', function(socket) ... );- 每次有连接事件时都会执行该函数。每次触发该事件时,“socket”参数都会引用一个全新的套接字对象,代表新连接的用户。然后,您需要将该套接字对象存储在某处,以便稍后查找,以便在其上调用 send 或 emit 方法,如果您需要发送只有该套接字可见的消息。

这是一个可以帮助您入门的简单示例。 (注意:我没有对此进行过测试,也不建议将其作为您正在尝试做的事情的最佳方式。我只是在答案编辑器中将其写出来给您一个想法你如何可以做你想做的事)

var allSockets = [];
io.sockets.on('connection', function(socket) 
  var userId = allSockets.push(socket);
  socket.on('newChatMessage', function(message) 
    socket.broadcast.emit('newChatMessage_response', data: message);
  );
  socket.on('privateChatMessage', function(message, toId) 
    allSockets[toId-1].emit('newPrivateMessage_response', data: message);
  );
  socket.broadcast.emit('newUserArrival', 'New user arrived with id of: ' + userId);
);

编辑:如果通过 id 您指的是 socket.io 分配的 id 值,而不是您分配的值,您可以使用 var socket = io.sockets.sockets['1981672396123987']; 获取具有特定 id 值的套接字(以上语法使用socket.io v0.7.9)

【讨论】:

谢谢,但我似乎无法让它工作:这就是我正在做的事情,错误:jsfiddle.net/KMfgL【参考方案2】:

如果没有看到完整的代码,很难确切地说出如何执行此操作,但听起来您想在您尝试发送到的单个套接字上调用 emit 方法。如果这与建立连接的套接字(即私人聊天伙伴)不同,那么您将需要一些其他方式来存储和检索您尝试与之通信的正确套接字。

var sck = someFunctionToGetAppropriateSocketObject();
sck.emit('newChatMessage_response',  data: message);

见http://socket.io/#how-to-use和https://github.com/learnboost/socket.io

【讨论】:

Eeek... 不要将数组索引位置用作标识符 - 尤其是,如果您正在修改该数组。尝试使users 成为一个对象(而不是数组)并执行诸如 key=socketID、value=socket 之类的操作。这应该可以让您根据 ID 获得实际的套接字对象。 (或者试试@fourk 下面提到的:var socket = io.sockets.sockets['1981672396123987'];(未经测试))

以上是关于Socket IO 发送到指定的用户 ID的主要内容,如果未能解决你的问题,请参考以下文章

使用 socket.io 向特定客户端发送消息,同时套接字 id 快速变化

使用Socket.io将消息发送到多个房间?

如何跨多个服务器 nodejs 和 socket.io 存储 socket.id

向 Socket.IO 1.0 中的特定 ID 发送消息

通过 socket.id 向客户端发送消息

如何使用 Socket.io 在一条消息中发送两个变量?