php - 如何在 ratchetphp 上自动重新连接客户端?

标签 php sockets client wss reactphp

我正在使用 rachetphp 为 api 服务器创建客户端。 但是我有一个问题,当我的连接关闭时,无论什么原因,我都无法自动重新连接。

这里是我使用的库:https://github.com/ratchetphp/Pawl

<?php

require __DIR__ . '/vendor/autoload.php';

$loop = React\EventLoop\Factory::create();
$connector = new Ratchet\Client\Connector($loop);

$connector('ws://127.0.0.1:9000', ['protocol1', 'subprotocol2'], ['Origin' => 'http://localhost'])
->then(function(Ratchet\Client\WebSocket $conn) {
    $conn->on('message', function(\Ratchet\RFC6455\Messaging\MessageInterface $msg) use ($conn) {
        echo "Received: {$msg}\n";
        $conn->close();
    });

    $conn->on('close', function($code = null, $reason = null) {
        echo "Connection closed ({$code} - {$reason})\n";
    });

    $conn->send('Hello World!');
}, function(\Exception $e) use ($loop) {
    echo "Could not connect: {$e->getMessage()}\n";
    $loop->stop();
});

$loop->run();

我想在连接关闭后每隔几秒尝试重新连接一次。 有什么想法吗?

最佳答案

这个想法很简单,但需要一些重构。我们必须将重新连接代码放在连接关闭时执行的处理程序中。为此,我们在 self 中传递了 $app 函数。

require __DIR__ . '/vendor/autoload.php';

$loop = React\EventLoop\Factory::create();
$connector = new Ratchet\Client\Connector($loop);

$app = function (Ratchet\Client\WebSocket $conn) use ($connector, $loop, &$app) {
    $conn->on('message', function (\Ratchet\RFC6455\Messaging\MessageInterface $msg) use ($conn) {
        echo "Received: {$msg}\n";
        $conn->close();
    });

    $conn->on('close', function ($code = null, $reason = null) use ($connector, $loop, $app) {
        echo "Connection closed ({$code} - {$reason})\n";

        //in 3 seconds the app will reconnect
        $loop->addTimer(3, function () use ($connector, $loop, $app) {
            connectToServer($connector, $loop, $app);
        });
    });

    $conn->send('Hello World!');
};

function connectToServer($connector, $loop, $app)
{
    $connector('ws://127.0.0.1:9000', ['protocol1', 'subprotocol2'], ['Origin' => 'http://localhost'])
        ->then($app, function (\Exception $e) use ($loop) {
            echo "Could not connect: {$e->getMessage()}\n";
            $loop->stop();
        });
}

connectToServer($connector, $loop, $app);

$loop->run();

想法是,当连接接收到 close 事件时,我们使用 connectToServer 函数重新连接:

$conn->on('close', function ($code = null, $reason = null) use ($connector, $loop, $app) {
    echo "Connection closed ({$code} - {$reason})\n";

    //in 3 seconds the app will reconnect
    $loop->addTimer(3, function () use ($connector, $loop, $app) {
        connectToServer($connector, $loop, $app);
    });
});

关于php - 如何在 ratchetphp 上自动重新连接客户端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43178554/

相关文章:

php - 我想要带有 where 条件的 sql 列的最后一个值

php - 关于 PHP 的初学者问题,除了 for/foreach/while 循环之外,还有其他方法可以显示来自 mySQL 的数据吗?

sockets - Azure VM - 无法连接到监听特定端口的 TCP 服务器

c++ - 设计 C++ 休息客户端

php - PHP线程化TCP套接字服务器

javascript - 为什么 jQuery 在 PHP 文件中不起作用?

php - 检测 WooCommerce "my account"页面的仪表板

java - 使用 UDP 的服务器-客户端

android - 设备之间的Android套接字

c# - 将网络摄像头从客户端流式传输到服务器 C# 的有效方法