我有一个应用程序使用多个命名空间来区分不同类型的客户端,所以从一开始我就以这种方式将它们分开(我正在使用集群并生成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
我想知道是什么原因引起的?因为我查看了我的代码,并将方法简化为我刚刚展示的存根,并且似乎无法找到问题。
感谢您的帮助。
答案 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
,所以无论何时向套接字发送消息从他未连接的命名空间,这将自动将其连接到该命名空间。虽然很奇怪。