向所有打开的套接字发送消息以供特定用户使用

时间:2012-02-21 14:36:44

标签: node.js socket.io

我正在开发一个个人网络应用程序,我想在其中推送特定于用户的消息,但是在每个标签中它们都已打开,并且消息可能只会转到一个标签。

我所做的是为每个套接字对象提供唯一的标识符。我可以向该特定用户发送消息,但它只会转到最后打开的选项卡。我可以看到我的套接字确实保持对两个标签的引用。见下文

{ 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是最后一个连接的。

1 个答案:

答案 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行,库就可以管理它。