Socket.IO 1.0.x:通过id获取socket

19

在0.9.x版本中,我们可以通过ID获取socket,方法如下:

io.sockets.socket(socketId)

但是在1.0.x版本中我们无法这样做。如何在1.0.x中按ID查找套接字?

7个回答

51

如果要使用socket.io 1.0,请使用:

io.sockets.connected[socketId]

对于0.9版本,它应该是io.sockets.sockets[socketId]而不是io.sockets.socket[socketId]


2
对于命名空间连接,我无法通过 io.sockets.connected[socketId].emit() 访问它,但是可以通过类似的方式工作 var nsp = io.of('/my-namespace'); 然后使用 nsp.connected[socketId].emit()。谢谢。 - Luckylooke
同意@Luckylooke的观点,我可以将它简化为一行代码,像这样: io.of('/namespace').connected[socketId].emit('message-tag', data, callback) 我认为值得一提的是,我也可以通过传递回调函数作为桥梁来请求从连接的客户端获取数据。 - Aryo

22

Socket.io版本4.0.0

io.sockets.sockets.get(socketId);

这段代码用于获取指定id的socket连接。

当与cluster adapter一起使用时,这不起作用。 - Sujith S Manjavana
你找到了集群/Redis适配器的解决方案吗? - boozi
这些答案都不适用于集群/Redis适配器。当我们在单个节点上运行时,它运行得很好。但是当涉及到使用Redis适配器的多个节点时,它就无法正常工作了。有没有适用于Redis适配器的解决方案? - undefined

19

你也可以使用类似这样的方式:

io.to(socketid).emit();

9

版本 3.0.3

// in "of", you can put '/' or whatever namespace you're using
    
io.of('/').sockets.get(socketId)

基本上,sockets 不再是一个简单的对象。它是一个 Map 对象,所以你必须使用 .get() 方法。

1
同样适用于v4.2.0版本。 - Henock Bongi

7

Socket.io Version 2.0.3+

    let namespace = null;
    let ns = _io.of(namespace || "/");
    let socket = ns.connected[socketId] // assuming you have  id of the socket

3
我尝试过的最简单的方法是:
var socket1 = io.of("/").connected[socketId];

那么您可以执行以下操作
socket1.join("some room");
socket1.leave("some room");
socket1.emit();

或其他你想要的事情。


0
你还可以使用fetchSockets()函数来获取使用socketId的连接,如下所示。
const sockets = await io.in(theSocketId).fetchSockets();

这个解决方案与socket.io redis/adaptor完美配合。有关更多API文档,请参考这里https://socket.io/docs/v4/server-api/#namespacesockets

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接