2013-07-04 184 views
62

我从socket.io + node.js开始,我知道如何在本地发送消息并广播socket.broadcast.emit()函数: - 所有连接的客户端都收到同样的信息。如何使用socket.io发送消息给特定客户端

现在,我想知道如何发送私人消息到一个特定的客户端,我的意思是一个私人聊天2人(客户端到客户端流)之间的套接字。谢谢。

+0

对不起psiphi75,但这个链接没有回复我的答案,不是一个重复的问题。 –

+1

@ psiphi75,这是不可重复的 – softvar

+1

无法忍受像@psiphi这样的人。你甚至是开发者吗? HTML5特定问题如何与独立库相关联?对于它的价值,WebSockets不是Socket.io。 Socket.io是一个可以使用WebSocket的库,但我离题了。这也是一个更具体的与图书馆有关仅向特定客户端发送数据的问题,而不是技术本身。 –

回答

74

当用户连接时,它应该发送一条消息到服务器,用户名必须是唯一的,比如电子邮件。

一对用户名和插座的应当被存储在一个对象是这样的:

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”服务器,并通过读取谁它是从哪里来的,你可以处理的数据和发送的消息。

+18

如果您使用此解决方案,那么您必须了解: 1.当用户断开连接时,您必须清理'用户'对象 2.它不支持第二个连接 - 例如从另一个浏览器。因此,如果用户从其他浏览器连接 - 旧连接将被覆盖。 –

+1

如何将套接字对象存储在数据存储中?我假设这不起作用,如果你有多个节点进程。 – chovy

+0

@chovy你必须使用redis。检查此https://github.com/LearnBoost/Socket.IO/wiki/Configuring-Socket.IO –

8

您可以参考socket.io rooms。 握手套接字 - 您可以将其加入到命名空间,例如“user。#{userid}”。

之后,你可以方便的名义发送悄悄话给任何客户端,例如:

io.sockets.in( 'user.125')发射( 'new_message',{文字: “Hello world”})

在上面的操作中,我们向用户“125”发送“new_message”。

谢谢。

+0

大家好,感谢您的第一个答案,我会尝试一下,让你知道这一点,因为我不想建立一个聊天,而是一个私人信使,就像你可以在Facebook上使用一样。 –

+0

有人可以帮我解决这个问题,我真的被困住了,我想添加一个用户名和我的套接字连接,并允许我的应用程序向特定用户发送消息,没有聊天室,这是一个类似Messenger的Facebook。谢谢,如果你知道! –

+0

首先你必须明白,这个用户名在所有用户中必须是唯一的。第二个 - 你不忘记在客户端订阅发出的消息吗? –

172

您可以使用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); 
} 

我希望你的想法。

+0

客户端看起来不会被绑定到特定的房间。 – chovy

+0

客户端不必知道房间,您的服务器将您的客户订阅到特定房间。客户只需要听取事件,服务器端确保客户端获得客户订阅的房间的事件。 – az7ar

+2

请更改此行io.socket.in('[email protected]')。emit('new_msg',{msg:'hello'});像这样io.sockets.in('[email protected]')。emit('new_msg',{msg:'hello'}); – silvesterprabu

1

在我们公司的一个项目,我们使用的是“房”的方式,它的名字是在交谈的唯一标识符的所有用户的用户ID的组合(我们的实现更喜欢Facebook的信使),例如:

| id |名称 | 1 | Scott | 2 |苏珊

“房间”的名字将是“1-2”(IDS排序升序)和断开socket.io自动清理房间

这样您发送邮件只是为了那个房间只在线(已连接)用户(在整个服务器中发送的软件包较少)。

15

肯定的: 简单,

这是你所需要的:

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); 
}); 

希望这会很适合你。

祝您好运!

+0

这个工程。谢谢 – yasiriqbal776

+0

您可以创建客户端和服务器端代码吗?我是scoket编程的新手。 [email protected] –

+0

@HARISH,请参考下面的链接,说明客户端真的发生了什么..我希望这可以帮助你更多..http://socket.io/get-started/chat/ – Trojan

相关问题