我正在开发一个个人网络应用程序,我想在其中推送特定于用户的消息,但是在每个标签中它们都已打开,并且消息可能只会转到一个标签。
我所做的是为每个套接字对象提供唯一的标识符。我可以向该特定用户发送消息,但它只会转到最后打开的选项卡。我可以看到我的套接字确实保持对两个标签的引用。见下文
{ id: '6121808001146368876',
namespace:
{ manager:
{ server: [Object],
namespaces: [Object],
sockets: [Circular],
_events: [Object],
settings: [Object],
handshaken: [Object],
connected: [Object],
open: [Object],
closed: {},
rooms: [Object],
roomClients: [Object],
oldListeners: [Object],
flashPolicyServer: [Object],
gc: [Object] },
name: '',
sockets:
{ '8072595141256968141': [Object],
'6121808001146368876': [Circular] },
auth: false,
flags: { endpoint: '', exceptions: [] },
_events: { connection: [Function] } }
从我看到的,我在namespace.sockets下有引用,但正如我所提到的那样,循环中只有一个是获取消息的。
我可以解决这个问题,如果是这样,我如何过滤到特定的套接字或者是否需要通过创建名称空间来完成?
另外一个socket只是一个对象而且是一个循环的意义是什么?从我所看到的主ID与圆形ID相同,圆形ID是最后一个连接的。
答案 0 :(得分:1)
解决方案应该很简单,有几种方法。
第一个,更复杂的是在维护的结构中存储指向用户的所有套接字的指针,因此对于指定的用户,你得到一个数组或套接字或socket.id,你必须添加和删除手动引用...不建议虽然可以实现(事实上,我在我的一个项目中这样做)。
第二个更容易让Socket.IO独自管理。 首先,您需要每个用户的唯一ID(我敢打赌他们有!),当用户连接时,您将他加入到具有来自用户ID的名称组合的房间:
socket.join( 'UserRoom' + userId );
在客户断开连接时,你将他从他的房间中移除:
socket.leave( 'UserRoom' + userId );
要向一个指定用户的所有已打开的用户标签广播消息,只需使用以下内容发出:
socket.broadcast.to( 'UserRoom' + userId ).emit( 'my fancy message' );
......或......
io.sockets.in( 'UserRoom' + userId ).emit( 'my fancy message' );
只需要在连接/断开连接上添加1行,库就可以管理它。