如何使用 socket io 和 node express 发送个人消息

Posted

技术标签:

【中文标题】如何使用 socket io 和 node express 发送个人消息【英文标题】:How to send personal messages using socket io and node express 【发布时间】:2016-02-26 16:27:59 【问题描述】:

我正在实施一个聊天系统,您可以在其中向与电击器连接的特定人员发送个人消息。 首先,我将用户名作为密钥与 shocket.id 一起放入名为“connectedUser”的 jason。

socket.username=loggeduser;
connectedUser[socket.username]=socket.id;

然后我使用此代码发送个人消息

socket.broadcast.to(connectedUser[usersnametobesent]).emit('chat',  message:result);

这很好用,但每当我使用它时,它只会在接收方显示消息,而不是在客户端显示消息。我需要在发送方和接收方都显示它。

【问题讨论】:

【参考方案1】:

您需要向发件人发送相同的内容。

socket.emit('chat', );

那个函数只会发送到那个套接字。

为什么不直接使用一些 DOM 操作将聊天消息添加到客户端。这也将增加更好的用户体验,因为如果说由于某种原因存在严重延迟,您的发件人会立即看到他发送的消息,而不是等待看到他的消息从套接字返回?

这是一个不错的套接字小备忘单:

 // sending to sender-client only
 socket.emit('message', "this is a test");

 // sending to all clients, include sender
 io.emit('message', "this is a test");

 // sending to all clients except sender
 socket.broadcast.emit('message', "this is a test");

 // sending to all clients in 'game' room(channel) except sender
 socket.broadcast.to('game').emit('message', 'nice game');

 // sending to all clients in 'game' room(channel), include sender
 io.in('game').emit('message', 'cool game');

 // sending to sender client, only if they are in 'game' room(channel)
 socket.to('game').emit('message', 'enjoy the game');

 // sending to all clients in namespace 'myNamespace', include sender
 io.of('myNamespace').emit('message', 'gg');

 // sending to individual socketid
 socket.broadcast.to(socketid).emit('message', 'for your eyes only');

感谢https://***.com/a/10099325


回答您的评论:

在套接字的情况下,如果您从客户端发送聊天消息,那么我们得到了 client1 和 client2

假设您有一个聊天窗口,您可能有一些 divs 和一些列表,例如 ul

Client1 发送给 Client2 ---> "Hello"

Client1 应该立即看到消息“Hello”,方法是使用简单的 Dom 内容,例如创建一个新的 div / li 并将其附加到聊天窗口,可能带有某种 ID 以跟踪消息。

然后,如果消息发送失败,您可以通过 id 找到失败的消息,将其删除,并可能附加一条错误消息,而不是说明消息发送失败。

同时,客户端 2 也没有发送过消息更明智

如果您使用套接字为两个用户填充消息,那么您可能会遇到

Client1 发送给 Client2 ----> "Hello"

现在,也许您的服务器出现故障或客户端出于某种原因失去连接一秒钟,他还没有看到他的消息并走了哦,也许它没有发送所以他走了

Client1 发送给 Client2 ----> "Hello"

Client1 发送给 Client2 ----> "Hello"

Client1 发送给 Client2 ----> "Hello"

仍然没有,他又做了 20 次。

服务器或其他任何东西突然解锁并发送 300 条问候消息,两个客户端都被垃圾邮件发送了。

抱歉格式化我在移动设备上。

【讨论】:

我对这个令人震惊的事情有点陌生,你能解释一下吗?以及如何使用DOM操作将聊天消息添加到客户端? 谢谢它的工作:) 备忘单很有用【参考方案2】:

简单地说,

这就是你需要的:

  io.to(socket.id).emit("event", data);

每当用户加入服务器时,都会生成包括 ID 在内的套接字详细信息。这是真正有助于向特定人发送消息的 ID。

首先我们需要将所有socket.ids存储在数组中,

 var people=;

 people[name] =  socket.id;

这里的名字是接收者的名字。示例:

 people["ccccc"]=2387423cjhgfwerwer23;

所以,现在我们可以在发送消息时获取带有接收者名称的 socket.id:

为此,我们需要知道接收者名称。您需要向服务器发出接收者名称。

最后是:

 socket.on('chat message', function(data)
 io.to(people[data.reciever]).emit('chat message', data.msg);
 );

希望这对你有用。!!祝你好运

【讨论】:

太棒了,我做了一些类似的事情,效果很好。无论如何,早点期待答案:D

以上是关于如何使用 socket io 和 node express 发送个人消息的主要内容,如果未能解决你的问题,请参考以下文章

如何实现 Laravel、node.js、socket.io 和 redis 以使用数据库创建实时聊天/通知

如何使用 node.js 和 socket.io 将文件从 iPhone 发送到另一台 iPhone?

如何使用 node.js 和 socket.io 通过 WebSockets 流式传输 MP3 数据?

如何使用 Socket.io 和 Node.js 开发大型聊天应用程序 [关闭]

如何使用 socket io 和 node express 发送个人消息

如何构建 Node/Angular/Socket.io 项目?