我从socket.io + node.js开始,我知道如何在本地发送消息并广播socket.broadcast.emit()
函数: - 所有连接的客户端都收到同样的信息。如何使用socket.io发送消息给特定客户端
现在,我想知道如何发送私人消息到一个特定的客户端,我的意思是一个私人聊天2人(客户端到客户端流)之间的套接字。谢谢。
我从socket.io + node.js开始,我知道如何在本地发送消息并广播socket.broadcast.emit()
函数: - 所有连接的客户端都收到同样的信息。如何使用socket.io发送消息给特定客户端
现在,我想知道如何发送私人消息到一个特定的客户端,我的意思是一个私人聊天2人(客户端到客户端流)之间的套接字。谢谢。
当用户连接时,它应该发送一条消息到服务器,用户名必须是唯一的,比如电子邮件。
一对用户名和插座的应当被存储在一个对象是这样的:
var users = {
'[email protected]': [socket object],
'[email protected]': [socket object],
'[email protected]': [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”服务器,并通过读取谁它是从哪里来的,你可以处理的数据和发送的消息。
如果您使用此解决方案,那么您必须了解: 1.当用户断开连接时,您必须清理'用户'对象 2.它不支持第二个连接 - 例如从另一个浏览器。因此,如果用户从其他浏览器连接 - 旧连接将被覆盖。 –
如何将套接字对象存储在数据存储中?我假设这不起作用,如果你有多个节点进程。 – chovy
@chovy你必须使用redis。检查此https://github.com/LearnBoost/Socket.IO/wiki/Configuring-Socket.IO –
您可以参考socket.io rooms。 握手套接字 - 您可以将其加入到命名空间,例如“user。#{userid}”。
之后,你可以方便的名义发送悄悄话给任何客户端,例如:
io.sockets.in( 'user.125')发射( 'new_message',{文字: “Hello world”})
在上面的操作中,我们向用户“125”发送“new_message”。
谢谢。
大家好,感谢您的第一个答案,我会尝试一下,让你知道这一点,因为我不想建立一个聊天,而是一个私人信使,就像你可以在Facebook上使用一样。 –
有人可以帮我解决这个问题,我真的被困住了,我想添加一个用户名和我的套接字连接,并允许我的应用程序向特定用户发送消息,没有聊天室,这是一个类似Messenger的Facebook。谢谢,如果你知道! –
首先你必须明白,这个用户名在所有用户中必须是唯一的。第二个 - 你不忘记在客户端订阅发出的消息吗? –
您可以使用socket.io房间。从客户端发出一个事件(在这种情况下,“加入”,可以是任何东西)与任何唯一的标识符(电子邮件,ID)。
客户端:现在
var socket = io.connect('http://localhost');
socket.emit('join', {email: [email protected]});
,从服务器端使用该信息来为该用户创建
服务器端的独特房间:
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
});
});
所以,现在每个用户已加入以用户电子邮件命名的房间。所以,如果你想发送特定用户的消息,你只需要
服务器端:
io.sockets.in('[email protected]').emit('new_msg', {msg: 'hello'});
最后剩下的事就在客户端被听“new_msg”事件。
客户端:
socket.on("new_msg", function(data) {
alert(data.msg);
}
我希望你的想法。
客户端看起来不会被绑定到特定的房间。 – chovy
客户端不必知道房间,您的服务器将您的客户订阅到特定房间。客户只需要听取事件,服务器端确保客户端获得客户订阅的房间的事件。 – az7ar
请更改此行io.socket.in('[email protected]')。emit('new_msg',{msg:'hello'});像这样io.sockets.in('[email protected]')。emit('new_msg',{msg:'hello'}); – silvesterprabu
在我们公司的一个项目,我们使用的是“房”的方式,它的名字是在交谈的唯一标识符的所有用户的用户ID的组合(我们的实现更喜欢Facebook的信使),例如:
| id |名称 | 1 | Scott | 2 |苏珊
“房间”的名字将是“1-2”(IDS排序升序)和断开socket.io自动清理房间
这样您发送邮件只是为了那个房间只在线(已连接)用户(在整个服务器中发送的软件包较少)。
肯定的: 简单,
这是你所需要的:
io.to(socket.id).emit("event", data);
每当用户连接到服务器时,会产生插座细节,包括ID。这个ID确实有助于向特定的人发送消息。
首先我们需要所有的socket.ids存储阵列,
var people={};
people[name] = socket.id;
这里的名字是接收器名称。 例子:
people["ccccc"]=2387423cjhgfwerwer23;
所以,现在我们可以得到,每当我们发送消息时,接收者名称socket.id:
为此,我们需要知道receivername。您需要将接收者名称发送到服务器。
最后一件事是:
socket.on('chat message', function(data){
io.to(people[data.receiver]).emit('chat message', data.msg);
});
希望这会很适合你。
祝您好运!
这个工程。谢谢 – yasiriqbal776
您可以创建客户端和服务器端代码吗?我是scoket编程的新手。 [email protected] –
@HARISH,请参考下面的链接,说明客户端真的发生了什么..我希望这可以帮助你更多..http://socket.io/get-started/chat/ – Trojan
对不起psiphi75,但这个链接没有回复我的答案,不是一个重复的问题。 –
@ psiphi75,这是不可重复的 – softvar
无法忍受像@psiphi这样的人。你甚至是开发者吗? HTML5特定问题如何与独立库相关联?对于它的价值,WebSockets不是Socket.io。 Socket.io是一个可以使用WebSocket的库,但我离题了。这也是一个更具体的与图书馆有关仅向特定客户端发送数据的问题,而不是技术本身。 –