如何使用socket.io向特定的客户端发送消息
我从socket.io + node.js开始,我知道如何在本地发送消息并广播socket.broadcast.emit()
函数: – 所有连接的客户端收到相同的消息。
现在,我想知道如何发送一个私人消息到一个特定的客户端,我的意思是一个私人聊天2人(客户端到客户端stream)之间的套接字。 谢谢。
当用户连接时,它应该发送一个消息到服务器,用户名必须是唯一的,如电子邮件。
一对用户名和套接字应该像这样存储在一个对象中:
var users = { 'userA@example.com': [socket object], 'userB@example.com': [socket object], 'userC@example.com': [socket object] }
在客户端上,使用以下数据将对象发送到服务器:
{ to:[the other receiver's username as a string], from:[the person who sent the message as string], message:[the message to be sent as string] }
在服务器上,侦听消息。 收到消息时,将数据发送给接收方。
users[data.to].emit('receivedMessage', data)
在客户端上,监听来自服务器的“receivedMessage”,通过读取数据,你可以处理来自谁的数据和发送的消息。
你可以使用socket.io房间。 从客户端发出一个事件(在这种情况下,“join”,可以是任何东西)与任何唯一的标识符(电子邮件,ID)。
客户端:
var socket = io.connect('http://localhost'); socket.emit('join', {email: user1@example.com});
现在,从服务器端使用该信息为该用户创build一个独特的空间
服务器端:
var io = require('socket.io').listen(80); io.sockets.on('connection', function (socket) { socket.on('join', function (data) { socket.join(data.email); // We are using room of socket io }); });
所以现在每个用户都join了一个以用户邮箱命名的房间。 所以如果你想发送一个特定的用户消息,你只需要
服务器端:
io.sockets.in('user1@example.com').emit('new_msg', {msg: 'hello'});
在客户端做的最后一件事是听“new_msg”事件。
客户端:
socket.on("new_msg", function(data) { alert(data.msg); }
我希望你明白这个主意。
SURE:简单地说,
这是你需要的:
io.to(socket.id).emit("event", data);
每当一个用户join服务器,套接字的详细信息将生成包括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); });
希望这对你有好处。祝你好运
你可以参考socket.io 房间 。 当您握手套接字时 – 您可以将其join命名空间,例如“user。#{userid}”。
之后,您可以通过方便的名称向任何客户端发送私人消息,例如:
io.sockets.in('user.125')。emit('new_message',{text:“Hello world”})
在上面的操作中,我们向用户“125”发送“new_message”。
谢谢。
在我们公司的一个项目中,我们使用的是“房间”方式,它的名字是一个对话中所有用户的用户id的组合,作为一个唯一的标识符(我们的实现更像是facebook messenger),例如:
| id | name | 1 | Scott | 2 | 苏珊
“房间”的名字将是“1-2”(ids按顺序排列),并断开socket.io自动清理房间
通过这种方式,您只能向该房间发送消息,并且仅向在线(已连接)的用户发送消息(在整个服务器中发送的包less)。
- jquery prepend + fadeIn
- 在后退button上保留dynamic更改的HTML
- 与PHP的jQuery Ajax POST例子
- 带有AngularJS的全局Ajaxerror handling程序
- jQuery UI自动完成:只允许从build议列表中select的值
- 指令attr内的callback函数在不同的attr中定义
- jQuery $ .ajax(),$ .post在Firefox中发送“OPTIONS”作为REQUEST_METHOD
- 如何在jQuery Ajax调用之后pipe理redirect请求
- validation错误发生后,如何使用PrimeFaces AJAX填充文本字段?