swoole 第19章 PHP与WebSocket服务器交互 swoole 第19章 PHP与WebSocket服务器交互

5小时前

一、安装扩展

composer require textalk/websocket

二、客户端代码

use WebSocketClient;
 
try {
    $client = new Client('ws://localhost:8080'); // 替换为你的WebSocket服务器地址
 
    $client->send('Hello WebSocket Server!'); // 发送消息
 
    $message = $client->receive(); // 接收消息
    echo "Received: " . $message . "
";
 
    $client->close(); // 关闭连接
} catch (Exception $e) {
    echo "Error: " . $e->getMessage() . "
";
}

发送二进制数据

$binaryData = pack('n', 12345); // 将整数12345打包成二进制数据
$client->send($binaryData);

接收二进制数据: 接收到的数据已经是字符串形式的二进制数据。可以使用

$receivedData = $client->receive();
$unpackedData = unpack('n', $receivedData); // 将接收到的二进制数据解包成整数
echo "Received Integer: " . $unpackedData[1] . "
";

循环重连: 将WebSocket连接和数据收发操作放在一个循环中。如果发生异常,捕获异常并等待一段时间后重新连接。

$maxRetries = 5;
$retryInterval = 3; // 秒

for ($i = 0; $i < $maxRetries; $i++) {
    try {
        $client = new Client('ws://localhost:8080');
        $client->send('Hello, attempt ' . ($i + 1));
        echo 'Received: ' . $client->receive() . PHP_EOL;
        $client->close();
        break; // 连接成功,跳出循环
    } catch (Exception $e) {
        echo 'Connection failed: ' . $e->getMessage() . PHP_EOL;
        if ($i < $maxRetries - 1) {
            echo 'Retrying in ' . $retryInterval . ' seconds...' . PHP_EOL;
            sleep($retryInterval);
        } else {
            echo 'Max retries reached. Giving up.' . PHP_EOL;
        }
    }
}

设置最大重试次数: 避免无限重连,设置一个最大重试次数,超过次数后停止重连。

指数退避: 每次重连失败后,增加等待时间。例如,第一次等待1秒,第二次等待2秒,第三次等待4秒,以此类推。这可以减轻服务器的压力。

状态监控: 维护一个连接状态变量,记录当前连接是否可用。在发送数据之前,先检查连接状态,如果连接已断开,则尝试重连。



阅读 9