使用 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 订阅一起使用?
如何使用nodejs socket.io向特定房间中的用户发送打字警报和消息