套接字中的命名空间.发送到特定套接字时的IO

Namespacing in socket.io when sending to a particular socket

本文关键字:套接字 IO 命名空间      更新时间:2023-09-26

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

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"});
  });
}

可以看到,第二个文件缺少输出中的名称空间部分。在实际应用中,我从客户端管理器中选择socket id,所以我使用socket。id,而不是client. getsocketid(),但思想是一样的,我只是在这里回显到原始客户端。

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

检查SocketNamespace的源代码后,语法似乎是io.of('space').socket(id).emit(...

[编辑根据Fuu的评论]

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

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