创建同步TCP客户端

程序代码

client.php

$client = new swoole_client(SWOOLE_SOCK_TCP);

//连接到服务器
if (!$client->connect('127.0.0.1', 9501, 0.5))
{
    die("connect failed.");
}
//向服务器发送数据
if (!$client->send("hello world"))
{
    die("send failed.");
}
//从服务器接收数据
$data = $client->recv();
if (!$data)
{
    die("recv failed.");
}
echo $data;
//关闭连接
$client->close();

创建一个TCP的同步客户端,此客户端可以用于连接到我们第一个示例的TCP服务器。向服务器端发送一个hello world字符串,服务器会返回一个 Server: hello world字符串。

这个客户端是同步阻塞的,connect/send/recv 会等待IO完成后再返回。同步阻塞操作并不消耗CPU资源,IO操作未完成当前进程会自动转入sleep模式,当IO完成后操作系统会唤醒当前进程,继续向下执行代码。

  • TCP需要进行3次握手,所以connect至少需要3次网络传输过程
  • 在发送少量数据时$client->send都是可以立即返回的。发送大量数据时,socket缓存区可能会塞满,send操作会阻塞。
  • recv操作会阻塞等待服务器返回数据,recv耗时等于服务器处理时间+网络传输耗时之合。

TCP通信过程

TCP通信

执行程序

php client.php
Server: hello world

  • alan

    我按照例子中的代码执行,没有任何返回。

  • Terry

    @team, 上面的client.php例子中,,没有输出 $data, 有误哈.

  • jianzi

    添加 print_r($data);

  • 早睡晚起

    你是不是没启动 server ?

  • 马运锋

    为什么在浏览器地址栏直接访问client.php 提示连接失败呢?

  • 蝶恋花

    Fatal error: swoole_client::connect(): event callback function is not set.。报错了

  • xmxx

    PHP Warning: swoole_client::recv(): recv() failed. Error: Resource temporarily unavailable [11] in task_client.php on line 15

  • NicholasFugui

    正确的姿势: 先启动之前做的TCP服务:php server.php 再启动这个客户端:php client.php

  • ― zY ke

    PHP Warning: swoole_client::recv(): recv() failed. Error: Resource temporarily unavailable [11] in task_client.php on line 15----服务端执行的时间超过你客户端设置的超时时间了这里有官方解释https://wiki.swoole.com/wiki/page/234.html

  • qxy

  • qxy

    我异步任务 我用TCP客户端 然后 我业务代码 通过 swooleclient (同步客户端)去执行异步任务 我在异步任务(服务端) sleep 10秒 我业务代码调取异步任务 应该是停留几秒 为什么 调取后不等返回结果 直接执行我剩下的业务代码呢 不是说 TCP客户端是同步阻塞的嘛 ---> { 这个客户端是同步阻塞的,connect/send/recv 会等待IO完成后再返回。同步阻塞操作并不消耗CPU资源,IO操作未完成当前进程会自动转入sleep模式,当IO完成后操作系统会唤醒当前进程,继续向下执行代码。}

  • 入乡随

    swoole相关教程:http://php91.ke.qq.com/