相关疑难解决方法(0)

棘轮PHP WAMP - React/ZeroMQ - 特定用户广播

注意:这是一样的这个问题,它利用MessageComponentInterface.我正在使用WampServerInterface,所以这个问题具体涉及那个部分.我需要一个代码示例和解释的答案,因为我可以看到这对将来的其他人有帮助.

试图为个人用户提供循环推送

我正在使用Ratchet和ZeroMQ的WAMP部分,我目前有推送集成教程的工作版本.

我正在尝试执行以下操作:

  • zeromq服务器已启动并正在运行,准备记录订阅者和取消订阅者
  • 用户通过websocket协议在他们的浏览器中连接
  • 一个循环开始将数据发送给特定的用户谁要求它
  • 当用户断开连接时,将停止该用户数据的循环

我有点(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)

php zeromq websocket ratchet reactphp

18
推荐指数
1
解决办法
9103
查看次数

打开连接时将用户 ID 从浏览器发送到 websocket 服务器

在问这个问题之前,我尽了最大努力阅读了关于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)

real-time zeromq websocket ratchet

7
推荐指数
1
解决办法
7188
查看次数

用户的棘轮存储连接和在服务器实例外发送消息

我一直在关注这里的教程并让棘轮服务器正常工作。

我的聊天课目前或多或少与教程相同,所以在这里展示这一点没有意义,因为我的问题更多是关于实施策略

在我附加的问题中,用户正在寻找如何获取特定用户的连接对象。在最佳答案解决方案中,跟踪资源 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 连接时创建的。如何以这种方式向特定客户端发送消息?

这是我试图实现的目标的视觉效果。

在此处输入图片说明

参考:

如何获取特定用户的连接对象?

php websocket symfony ratchet

5
推荐指数
1
解决办法
3816
查看次数

标签 统计

ratchet ×3

websocket ×3

php ×2

zeromq ×2

reactphp ×1

real-time ×1

symfony ×1