我会跟踪数组中连接的每个用户的列表.因此,如果有新的连接,它将检查用户是否已经在列表中,如果他已经在列表中,然后在列表中分配他们的socket.id和相应的socket.id,否则只需添加它们到列表.
这是为了防止同一用户在尝试进行多重登录时被算作2个用户.
Object.keys(client).forEach(function (key) {
if (client[key].id == data.id){
is_connected = true;
socket.id = key;
}
});
Run Code Online (Sandbox Code Playgroud)
处理尝试多次登录的用户发送/接收的消息/聊天时没有问题.
socket.on('chat', function(msg){
var data = {"name": client[socket.id].name, "message": msg};
io.emit('chat', data);
});
Run Code Online (Sandbox Code Playgroud)
聊天消息的io.emit成功发送给尝试多次登录的用户.
我得到的问题是每当用户决定退出/断开服务器时.
io.emit('user_leave', client[socket.id].id);
Run Code Online (Sandbox Code Playgroud)
[多登录案例] - >多用户和双用户是尝试多重登录的同一用户
每当主用户与服务器断开连接时,双用户就会收到服务器发送的'user_leave',因为io.emit应该将其发送到所有套接字.
但不是这样,当子用户与服务器断开连接时,主用户不会收到服务器发出的"user_leave".
*注意:主用户先登录,然后双用户登录.因此,主用户信息直接保存在阵列中,而子用户socket.id则分配了主用户套接字.id
[更新]
B2 socket.id分配了B1 socket.id,io.emit用于聊天工作完美,而io.emit for disconnect只发送给All,除了双用户(B2)