【问题标题】:Namespacing in socket.io when sending to a particular socket发送到特定套接字时 socket.io 中的命名空间
【发布时间】:2011-08-20 11:16:20
【问题描述】:

当我为我的应用程序命名时,我遇到了一个问题,我想将数据发送到特定的套接字,这是我正在使用的代码的缩写版本:

var io = require('socket.io').listen(config.web.port);

var chat = io.of('space').on('connection', function (socket) {

  // This works:
  // Input: xhr-polling received data packet 5::/space:{"name":"test"}
  // Output: xhr-polling writing 5::/space:{"name":"test","args":[{"msg":"test"}]}
  socket.on('test', function(){
    socket.emit('test',{msg: "test"});
  });

  // This fails:
  // Input: xhr-polling received data packet 5::/space:{"name":"test2"}
  // Output: xhr-polling writing 5:::{"name":"test2","args":[{"msg":"test2"}]}      
  socket.on('test2',function(){
    io.sockets.socket(socket.id).emit('test2',{msg: "test2"});
  });
}

如您所见,第二个缺少输出中的命名空间部分。在真正的应用程序中,我从客户端管理器中选择套接字 id,因此我在这段代码中使用 socket.id 而不是 client.getSocketId(),但这个想法与我只是在回应源客户端在这里。

如何使第二种方法在输出到客户端时使用正确的命名空间?

【问题讨论】:

    标签: javascript node.js socket.io


    【解决方案1】:

    签出the source for SocketNamespace 后,语法似乎是io.of('space').socket(id).emit(...

    [根据 Fuu 的评论编辑]

    为了找到这个,我检查了 Socket.IO GitHub repository 并寻找一个与命名空间有关的文件——namespace.js 似乎符合要求。该文件不是很长,所以我扫描了它,寻找 SocketNamespace 原型上的方法,看起来它可以满足我们的需求。

    由于您调用 io.sockets.socket 在全局命名空间中查找套接字,所以 SocketNamespace.prototype.socket 在我看来很有希望。此外,它接受一个名为sid 的参数,并且该方法的主体似乎是从该ID 的套接字哈希中获取一个套接字。 Socket 是我们想要的(它包含 emit 方法),所以我假设这是在这种情况下使用的方法。

    【讨论】:

    • 谢谢,问题解决了!您能否如此友善并编辑您的答案以包括您从 SocketNamespace 的源代码中找出这一点的方式?通读一遍,我无法弄清楚。我想了解详情。 :)
    • 嗯,我得到了 SocketNamespace.prototype.socket 部分的功能,但是你如何推断​​需要替换 'io.sockets.socket( )'?
    • 因为您在第二行代码中使用io.of('space')返回命名空间对象,所以您可以在这里再次使用它。
    猜你喜欢
    • 2017-12-03
    • 1970-01-01
    • 2019-01-24
    • 2016-09-04
    • 2016-11-04
    • 1970-01-01
    • 2018-08-03
    • 1970-01-01
    • 2014-01-19
    相关资源
    最近更新 更多