发送到特定套接字时在socket.io中命名空间

时间:2011-08-20 11:16:21

标签: javascript node.js socket.io

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

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(),但这个想法与我只是回应到来源客户在这里。

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

1 个答案:

答案 0 :(得分:5)

结帐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方法),所以我的假设是这是在这种情况下使用的方法。