swoole--协程TCP客户端

2021-05-23

使用方法和 Client 同步模式方法完全一致,Coroutine\Client 的所有涉及网络请求的方法,Swoole 都会进行协程调度,业务层无需感知,connect 超时设置同时作用于 Connect 和 Recv、Send 超时;Swoole\Client提供的方法均可在 Coroutine\Client 中使用

use Swoole\Coroutine\Client;
use function Swoole\Coroutine\run;

run(function () {
    $client = new Client(SWOOLE_SOCK_TCP);
    // 设置客户端参数
    $client->set([
        'timeout' => 10,//总超时,包括连接、发送、接收所有超时
        'connect_timeout' => 10,//连接超时
        'read_timeout' => 10,//接收超时
        'write_timeout' => 10,//发送超时
    ]);
    // 连接到远程服务器,connect 连接失败后,不可直接进行重连。
    // 必须使用close关闭已有socket,然后再进行connect重试
    if (!$client->connect($host, $port, $timeout = 0.5)) {
        //$timeout  网络 IO 的超时时间;包括 connect/send/recv,超时发生时,连接会被自动 close
        echo "connect failed. Error: {$client->errCode}\n";

        //关闭连接
        $client->close();
        //重试
        $client->connect('127.0.0.1', 9501);
    }
    // 判断连接状态,表示客户端已连接,但是不一定可用(成功send或recv)
    // 执行send或recv时应用层与内核发生交互,才能得到真实的连接可用状态。
    if ($client->isConnected()) {
        // 向服务端发送字符串数据,支持二进制数据,返回发送数据的长度
        $client->send($data);
        
        // 从服务器端接收数据
        // 设置了通信协议,recv会返回完整的数据,长度受限于package_max_length
        // 未设置通信协议,recv最大返回64K数据
        // 返回空字符串表示服务端主动关闭连接,需要close;
        // 失败,返回false
        $client->recv(float $timeout = 0);
    }

    // 返回socket缓冲区中的数据,无数据时返回返回false
    $client->peek(int $length = 65535);
});

 

{/if}