1

我有一个应用程序使用多个命名空间来区分不同类型的客户端,所以从一开始我就以这种方式将它们分开(我使用集群并产生 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

我想知道这可能是什么原因造成的?因为我查看了我的代码,并将方法简化为我刚刚展示的存根,但似乎无法找到问题所在。

谢谢你的帮助。

4

2 回答 2

0

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

为了解决您的问题,我会使用一个连接,但请考虑如何构建您的网站。例如,使用房间并在会话中存储新用户 ID,以确定将用户放置在哪个房间或命名空间中。

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

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

于 2012-12-07T13:48:09.077 回答
0

事实证明,在我的代码中的某个时刻,我有 aio.of("/TYPE_ONE").socket(socket.id).emit(message); 和 thatsocket属于 namespace TYPE_TWO,所以似乎每当您从他未连接的命名空间向套接字发送消息时,这会自动将其连接到说命名空间。不过很奇怪。

于 2012-12-07T21:41:56.733 回答