2

下面是我处理动态分配的命名空间的代码。客户端连接,然后,使用它的引用者,查找客户端的帐户 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');
            });
        });
    });
});
4

1 回答 1

3

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

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

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

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

于 2012-11-28T08:17:14.823 回答