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

下面是我处理dynamic分配的命名空间的代码。 然后,客户端连接,然后使用它的引用来查找客户端的帐户ID,在下面没有的function中,如果该帐户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'); }); }); }); }); 

您的逻辑是这样编写的,只要套接字连接到基本名称空间,就会创build名称空间的连接处理程序。 因此,每当新客户端连接到基本名称空间时,就build立了另一个连接处理程序。 换句话说,你在打电话

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

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

我不太清楚你的需求,但我会认为房间会是更好的解决scheme。 命名空间实际上被devise用于复用连接(例如,在同一个Socket.IO端口上运行的多个完全不相关的应用程序); 房间允许您将套接字分组为逻辑组,并将消息发送到该组中的套接字。