一个套接字连接多个名称空间

时间:2012-12-06 23:17:51

标签: multithreading node.js namespaces socket.io

我有一个应用程序使用多个命名空间来区分不同类型的客户端,所以从一开始我就以这种方式将它们分开(我正在使用集群并生成4个进程)

//server code
io.of("/TYPE_ONE").on("connection", function(socket){
    console.log("Client connected to TYPE_ONE with id:\t"+socket.id+"\t"+process.env.NODE_WORKER_ID);
});

io.of("/TYPE_TWO").on("connection", function(socket){
    console.log("Client connected to TYPE_TWO with id:\t"+socket.id+"\t"+process.env.NODE_WORKER_ID);
});

//client code

//for type one
socket = io.connect("http://mydomain.com/TYPE_ONE", socketOptions);

//different files always, only one type sent to each client

//for type two
socket = io.connect("http://mydomain.com/TYPE_TWO", socketOptions);

突然,在查看控制台后,当一个客户端连接时,我得到以下输出:

Client connected to TYPE_ONE with id:    1234      3
 .
 .
 .
Client connected to TYPE_TWO with it:    1234      3 
(same id and workerId as previous connection)

我确定只有一个连接到服务器,t

我想知道是什么原因引起的?因为我查看了我的代码,并将方法简化为我刚刚展示的存根,并且似乎无法找到问题。

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

您的代码中没有错误:您只有一个连接,因此套接字连接到具有一个socket.id的命名空间。我不知道如何建立多个连接,也许你应该尝试两个连接端口,或多次连接/监听服务器。

要解决您的问题,我会使用一个连接,但想想如何建立您的网站。例如,使用会议室并在会话中存储新用户ID,以确定放置用户的房间或名称空间。

“多个命名空间和多个房间可以共享相同的(WebSocket)连接” socket.io rooms or namespacing?

如果要区分客户端,可以将主题放在一个命名空间中的另一个房间,并让他们的socket.id检查它们是什么房间(或者使用socket.id名称(.joind(socket.id))加入房间。 https://github.com/LearnBoost/socket.io/wiki/Rooms

答案 1 :(得分:0)

事实证明,在我的代码中的某个时刻,我有io.of("/TYPE_ONE").socket(socket.id).emit(message);并且socket属于命名空间TYPE_TWO,所以无论何时向套接字发送消息从他未连接的命名空间,这将自动将其连接到该命名空间。虽然很奇怪。