为什么我的socket.emit事件多次激活(基于全局连接数)到同一个客户端?

时间:2012-11-28 06:24:56

标签: node.js socket.io

下面是我处理动态分配的命名空间的代码。客户端连接,然后使用它的引用来查找客户端的帐户ID,并且在下面没有的函数中,如果该帐户ID尚未分配给它,则生成新的命名空间(UUID)或返回现有的命名空间。

然后,该命名空间被发送到客户端,客户端依次响应该特定命名空间上的新connect消息。

这一切都有效。

不幸的是,ns_socket.emit('hi');语句被反射回ns_socket,无论多少客户端已连接。

要明确的是,如果客户端1连接到命名空间,hi将向该客户端触发一次。当客户端2连接到同一名称空间时,hi会因为一个未知(对我而言)原因而向该第二个客户端触发两次,当它应该只触发一次。

显然,非常感谢任何帮助。

var main = io.of('').on('connection', function(socket) {
    socket.on('joinDynNs',function(data) {
        var nameslug = socket.handshake.headers.referer.match(/(http(s)?:\/\/)([A-Za-z0-9-]+)\./)[3];
        getActID(nameslug, function(actID) {
            var ns = getNamespace(nS, actID);
            socket.emit('assignNamespace',{ns:ns});
            io.of('/' + ns).on('connection', function(ns_socket) {
                ns_socket.emit('hi');
            });
        });
    });
});

1 个答案:

答案 0 :(得分:3)

编写逻辑时,只要套接字连接到基本命名空间,就会创建命名空间的连接处理程序。因此,每次新客户端连接到基本命名空间时,都会设置另一个连接处理程序。换句话说,你正在打电话

io.of('/' + ns).on('connection', function(ns_socket) {
    ns_socket.emit('hi');
});

每次进入新连接时。连接处理程序不是特定于您正在处理的套接字;它会触发命名空间上的任何新连接。这就是你看到递增消息计数的原因。

我不完全确定你的需求,但我认为rooms对你来说是更好的解决方案;命名空间实际上设计用于多路复用连接(例如,在同一个Socket.IO端口上运行的多个完全不相关的应用程序); rooms允许您将套接字分组为逻辑组,并将消息发送到该组中的套接字。