我正在学习Ratchet(用于PHP中的实时聊天应用程序的库)。根据文档,以下函数将收到两件事:
然而,它错过了发送者。此功能将消息发送给所有已连接的人员。但我也希望实现一对一的聊天。有办法吗?
以下是该图书馆的链接:http://socketo.me/docs/hello-world。
public function onMessage(ConnectionInterface $from, $msg) {
//send the message to all the other clients except the one who sent.
foreach ($this->clients as $client) {
if ($from !== $client) {
$client->send($msg);
}
}
}
答案 0 :(得分:1)
我建议您根据用户的需要进行不同的订阅。
每个人之间聊天消息的一个频道:subscriptionname = room123
对于每次个人聊天,您可以使用不同的签名:subscriptionname = personal456。
然后让您的客户端应用程序收听2个不同的订阅并尝试根据收到该消息的订阅名称进行路由。
答案 1 :(得分:0)
是的,您可以执行一对一的消息。但是,这些仍然必须通过套接字服务器 - 您不能在浏览器之间进行直接的对等消息传递。每个用户都有一个永久打开的连接,但只能与服务器连接。
您需要做的是针对每个客户端连接存储用户名,以便在遍历$this->clients
时,您可以检索连接或用户名。然后,您可以将此列表广播给所有订阅者,具体取决于您的设计所需的任何隐私限制。
最后,每个用户可以通过指定:
发送私人消息这将由Ratchet接收,然后您可以使用用户名在$this->clients
中进行连接查找。您最终使用的连接(如果它仍处于打开状态)是用于转发邮件的连接。
您可以选择发送" ack" (确认)发件人说他们的信息是(或没有)传递的。
答案 2 :(得分:0)
过滤掉客户端的问题是,根据文档,连接对象被重用,这意味着您实际上可以有多个客户端共享同一连接对象。