一、安装扩展
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秒,以此类推。这可以减轻服务器的压力。
状态监控: 维护一个连接状态变量,记录当前连接是否可用。在发送数据之前,先检查连接状态,如果连接已断开,则尝试重连。
swoole 第19章 PHP与WebSocket服务器交互