注意:这是不一样的这个问题,它利用
MessageComponentInterface
.我正在使用WampServerInterface
,所以这个问题具体涉及那个部分.我需要一个代码示例和解释的答案,因为我可以看到这对将来的其他人有帮助.
我正在使用Ratchet和ZeroMQ的WAMP部分,我目前有推送集成教程的工作版本.
我正在尝试执行以下操作:
我有点(1)和(2)工作,但我遇到的问题是第三个:
首先:如何仅向每个特定用户发送数据?广播将它发送给每个人,除非"主题"最终可能是个人用户ID?
其次:我有一个很大的安全问题.如果我发送哪个用户ID想要从客户端订阅,这似乎是我需要的,那么用户可以将变量更改为另一个用户的ID,而是返回他们的数据.
第三:我必须运行一个单独的php脚本,其中包含zeromq的代码以启动实际的循环.我不确定这是最好的方法,我宁愿让它完全在代码库中工作,而不是单独的php文件.这是我需要排序的主要领域.
以下代码显示了我目前拥有的内容.
我按字面输入php bin/push-server.php
来运行它.订阅和取消订阅将输出到此终端以进行调试.
$loop = React\EventLoop\Factory::create();
$pusher = Pusher;
$context = new React\ZMQ\Context($loop);
$pull = $context->getSocket(ZMQ::SOCKET_PULL);
$pull->bind('tcp://127.0.0.1:5555');
$pull->on('message', array($pusher, 'onMessage'));
$webSock = new React\Socket\Server($loop);
$webSock->listen(8080, '0.0.0.0'); // Binding to 0.0.0.0 means remotes can connect
$webServer = new Ratchet\Server\IoServer(
new Ratchet\WebSocket\WsServer(
new Ratchet\Wamp\WampServer(
$pusher
) …
Run Code Online (Sandbox Code Playgroud) 在问这个问题之前,我尽了最大努力阅读了关于SO的严重问题(标记为Ratchet)并处理类似的问题,但无济于事。我什至问了一个没有引起注意的问题,因此我删除了它以写另一个问题(希望是更清晰)。
我的最终目标是使用 Ratchet 构建一个一对一的私人聊天应用程序。除了我无法向特定用户发送消息之外,一切工作正常。
每个登录用户在访问网站的安全区域时都会连接到 websocket 服务器:
$(document).ready(function() {
var conn = new WebSocket('ws://localhost:8080');
conn.onopen = function(e) {
console.log("Connection established!");
// Here I need to send the logged in user_id to websocket server
// and get it in onOpen method so that I can index my array
// of connections with user_id instead of
//$connection->ResourceId, I explain more below
};
conn.onmessage = function(e) {
console.log(e.data);
};
});
Run Code Online (Sandbox Code Playgroud)
当用户在聊天框中写入消息时,消息会通过 AJAX 发送到 Web 服务器,然后使用 ZeroMQ 推送到 Websocket。在控制器中:
// Persistence of Message(message_id, sender_id, …
Run Code Online (Sandbox Code Playgroud) 我的聊天课目前或多或少与教程相同,所以在这里展示这一点没有意义,因为我的问题更多是关于实施策略。
在我附加的问题中,用户正在寻找如何获取特定用户的连接对象。在最佳答案解决方案中,跟踪资源 ID 似乎是实现此目的的方法。
例如,当创建连接时,有此代码。
public function onOpen(ConnectionInterface $conn) {
// Store the new connection to send messages to later
$this->clients[$conn->resourceId] = $conn;
echo "New connection! ({$conn->resourceId})\n";
}
Run Code Online (Sandbox Code Playgroud)
这将创建一个成员变量clients
来存储所有连接,您现在只需通过 ID 引用它即可发送消息。然而,这个客户是一个实例 ConnectionInterface $conn
然后要发送消息,您只需使用下面的代码输入客户端的 id 作为数组键。很简单。
$client = $this->clients[{{insert client id here}}];
$client->send("Message successfully sent to user.");
Run Code Online (Sandbox Code Playgroud)
正如我们所知,棘轮作为服务器上的脚本在一个永无止境的事件循环中运行。
我正在运行一个 Symfony 项目,其中当用户在系统中执行某个操作时,在服务器实例之外运行棘轮代码,我需要它向连接到服务器的特定客户端发送消息。
我不确定如何执行此操作,因为客户端是 ConnectionInterface 的实例,并且是在用户首次通过 WebSockets 连接时创建的。如何以这种方式向特定客户端发送消息?
这是我试图实现的目标的视觉效果。
参考: