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

Posted

技术标签:

【中文标题】向 Socket.IO 1.0 中的特定 ID 发送消息【英文标题】:Sending message to a specific ID in Socket.IO 1.0 【发布时间】:2014-07-25 07:50:30 【问题描述】:

我想将数据发送到一个特定的套接字 ID。

我们过去可以在旧版本中做到这一点:

io.sockets.socket(socketid).emit('message', 'for your eyes only');

我将如何在 Socket.IO 1.0 中做类似的事情?

【问题讨论】:

【参考方案1】:

在 socket.io 1.0 中,它们为此提供了更好的方法。每个套接字都通过 self id 自动加入一个默认房间。查看文档:http://socket.io/docs/rooms-and-namespaces/#default-room

因此您可以使用以下代码通过 id 向套接字发出:

io.to(socketid).emit('message', 'for your eyes only');

【讨论】:

to (room_id) 和 (user_socket_id) 有区别吗?我实际上用它来向一个可以有一个或多个用户的房间发送消息。 “这使得向其他套接字广播消息变得容易:”,然后可以是一个或多个,而不是唯一的私有的。 @WashingtonBotelho,套接字 ID 通常看起来像“Uj5CRqZ5b_Xubx9sAAAA”,所以理论上这样的房间里可能有不止一个用户,但实际上我不知道什么时候我会添加一个用户到另一个用户的个人房间。 我们如何通过socketId识别特定用户,这是否意味着我们需要在某处存储用户(例如用户名)和socketId的键值对? @Mustafa Dokumacı merhaba, bana bir yardim et ***.com/questions/38817680/… 这太不合逻辑了......为什么不只是为我们提供一种向套接字 ID 号发送消息的方法,仅此而已?无论如何都赞成,唯一真正适用于 2.x 的解决方法【参考方案2】:

在 socket.io 1.0 中,您可以使用以下代码做到这一点:

if (io.sockets.connected[socketid]) 
    io.sockets.connected[socketid].emit('message', 'for your eyes only');

更新:

@MustafaDokumacı 的回答包含更好的解决方案。

【讨论】:

这个答案和更好的答案之间的区别在于,使用这个解决方案,你可以有很好的回调。但是使用 io.to(socketid),你不能使用回调。【参考方案3】:

@Mustafa Dokumacı 和 @Curious 已经提供了足够的信息,我正在添加如何获取套接字 ID。

要获取套接字 id,请使用 socket.id

var chat = io.of("/socket").on('connection',onSocketConnected);

function onSocketConnected(socket)
   console.log("connected :"+socket.id);  

【讨论】:

【参考方案4】:

如果您使用了命名空间,我发现以下方法有效:

//Defining the namespace <br>
var nsp = io.of('/my-namespace');

//targeting the message to socket id <br>
nsp.to(socket id of the intended recipient).emit('private message', 'hello');

关于命名空间的更多信息: http://socket.io/docs/rooms-and-namespaces/

【讨论】:

【参考方案5】:

我相信@Curious 和@MustafaDokumacı 都提供了行之有效的解决方案。但不同之处在于,使用@MustafaDokumacı 的解决方案,消息被广播到一个房间,而不仅仅是一个特定的客户。

当请求确认时,区别很明显。

io.sockets.connected[socketid].emit('message', 'for your eyes only', function(data) ...);

按预期工作,而

io.to(socketid).emit('message', 'for your eyes only', function(data) ...);

失败了

Error: Callbacks are not supported when broadcasting

【讨论】:

【参考方案6】:

在 Node.js --> socket.io --> 有聊天例子可以下载 将此粘贴到行中(io on connection)部分..我使用此代码可以 100% 工作

io.on('connection', function(socket)
  socket.on('chat message', function(msg)
    console.log(socket.id);
    io.to(socket.id).emit('chat message', msg+' you ID is:'+socket.id);
  );
);

【讨论】:

【参考方案7】:

更新 Socket.io v4.0+

var socketById = io.sockets.sockets.get(id);
socketById.emit("message", "hi")

这是在 v4 中通过 ID 获取套接字并向其发射的最佳方式。

【讨论】:

以上是关于向 Socket.IO 1.0 中的特定 ID 发送消息的主要内容,如果未能解决你的问题,请参考以下文章

通过 Socket.IO 1.0 发送到具有 socketId 的特定客户端

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

向特定的套接字 id 发送私人消息

如何使用nodejs socket.io向特定房间中的用户发送打字警报和消息

使用 Socket IO、Laravel、Redis、Angularjs 向特定用户发送数据

如何将 socket.io 与 graphql 订阅一起使用?