如何使用 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 开发大型聊天应用程序 [关闭]