使用 socket.io 向特定客户端发送消息,同时套接字 id 快速变化

Posted

技术标签:

【中文标题】使用 socket.io 向特定客户端发送消息,同时套接字 id 快速变化【英文标题】:send message to specific client using soocket.io while socket id changes rapidly 【发布时间】:2020-03-06 17:23:19 【问题描述】:

我正在使用 node.js 和 socket 运行聊天服务器,并希望将消息发送到特定客户端。我使用 socket.id 将消息发送给定义的用户,如下所示:

io.sockets.in(user socket.id).emit('message',message)

但是有一个问题: 用户保持连接但套接字 id 快速变化(大约每秒一次),所以我不能使用 socket.id。我尝试使用 socket.join(用户电子邮件)使用用户电子邮件而不是套接字 id,但是在套接字 id 更改后它不起作用更多的。 解决此问题的最佳方法是什么?会话 ID?如果是,如何?客户端的聊天应用程序在 android 设备上运行。 这是我的代码:

io.on("connection", function(socket) 

socket.on("login", function(useremail) 
 socket.join(useremail);
);

//Here i want to send message to specific user
socket.on('messagedetection', (senderNickname,messageContent,targetuser) => 

    //create a message object 
   let  message = "message":messageContent, "senderNickname":senderNickname

   //targetuser is the email of target user,joined to the socket in login 
   io.sockets.in(targetuser).emit('message',message)
  );
  socket.on('disconnect', function() 
console.log( ' user has left ')
socket.broadcast.emit("userdisconnect"," user has left ") );

【问题讨论】:

这根本不对,您需要提供更多详细信息,说明为什么套接字会以如此高的速率断开/重新连接。 @James 其实我不知道为什么会这样。因为我在本地主机上没有这个问题。 要解决的问题是快速断开/重新连接客户端。这清楚地表明配置中的某些内容不正确。可能是网络基础设施未正确配置以允许持久的 socket.io 连接。或者,如果您的系统是集群的,则可能是由非粘性负载平衡引起的。 @jfriend00 是的。这就是问题所在。谢谢。 【参考方案1】:

将我的评论变成答案,因为这确实是问题所在:

要解决的问题是快速断开/重新连接客户端。这清楚地表明配置中的某些内容不正确。

可能是网络基础设施未正确配置以允许持久的 socket.io/webSocket 连接。或者,如果您的系统是集群的,则可能是由非粘性负载平衡引起的。

因此,每次连接被网络基础设施关闭时,客户端 socket.io 库都会尝试重新连接,为新连接创建一个新 ID。

【讨论】:

以上是关于使用 socket.io 向特定客户端发送消息,同时套接字 id 快速变化的主要内容,如果未能解决你的问题,请参考以下文章

如何将 socket.io 与 graphql 订阅一起使用?

如何在socket.io中向特定用户发送消息?

如何使用nodejs socket.io向特定房间中的用户发送打字警报和消息

向 Socket.IO 1.0 中的特定 ID 发送消息

当套接字重新连接时,如何让 socket.io 服务器向特定套接字重新发送消息?

向 Socket.io 中的其他房间发送消息