下面是我处理动态分配的命名空间的代码。然后,客户端使用其引用器进行连接,查找客户端的帐户 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');
});
});
});
});
编写逻辑时,只要套接字连接到基命名空间,就会创建命名空间的连接处理程序。因此,每次新客户端连接到基命名空间时,都会设置另一个连接处理程序。换句话说,你在打电话
io.of('/' + ns).on('connection', function(ns_socket) {
ns_socket.emit('hi');
});
每次有新连接进入时。连接处理程序不特定于您正在处理的套接字;它会为命名空间上的任何新连接触发。这就是您看到消息计数递增的原因。
我不确定您的全部需求,但我认为房间对您来说是一个更好的解决方案;命名空间实际上是为用于多路复用连接而设计的(例如,在同一 Socket.IO 端口上运行多个完全不相关的应用程序);房间允许您将套接字分组到逻辑组中,并将消息发送到该组中的套接字。