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

时间:2016-02-26 16:27:59

标签: node.js socket.io

即时实现聊天系统,您可以将个人消息发送给连接到插座的特定人员。 首先我将用户名作为密钥与shocket.id一起放入名为“connectedUser”的jason中。

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

然后即时使用此代码发送个人信息

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

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

2 个答案:

答案 0 :(得分:2)

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

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://stackoverflow.com/a/10099325

回答你的评论:

对于套接字,如果您从客户端发送聊天消息,那么我们就得到了client1和client2

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

Client1发送给Client2 ---> "你好"

Client1应该立即看到消息" Hello"通过使用简单的Dom之类的东西,比如创建一个新的div / li并将其附加到聊天窗口,可能会使用某种ID来跟踪消息。

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

与此同时,client2没有更好的消息发送过

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

的情况

Client1发送给Client2 ----> "你好"

现在也许你的服务器出现打嗝或客户端因为某种原因丢失连接一秒钟,他还没有看到他的消息然后去哦哦也许它没有发送所以他去了

Client1发送给Client2 ----> "你好"

Client1发送给Client2 ----> "你好"

Client1发送给Client2 ----> "你好"

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

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

很抱歉我在手机上格式化了。

答案 1 :(得分:1)

简单地说,

这就是你需要的:

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

每当用户加入服务器时,都会生成包含ID的套接字详细信息。这个ID确实有助于向特定人员发送消息。

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

 var people={};

 people[name] =  socket.id;

此处名称是接收者名称。例如:

 people["ccccc"]=2387423cjhgfwerwer23;

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

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

最后一件事是:

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

希望这适合你。!!祝你好运