× 警告!旧版文档已经暂停维护,请查看新版文档。点击前往新版文档

Client

Client提供了TCP/UDP socket的客户端的封装代码,使用时仅需 new Swoole\Client 即可。

4.4.8版本开始,移除了对异步回调的支持,迁移至ext-async扩展中,独立为Swoole\Async\Client

优势

  • stream函数存在超时设置的陷阱和Bug,一旦没处理好会导致Server端长时间阻塞
  • stream函数的fread默认最大8192长度限制,无法支持UDP的大包
  • Client支持waitall,在有确定包长度时可一次取完,不必循环读取
  • Client支持UDP Connect,解决了UDP串包问题
  • Client是纯C的代码,专门处理socketstream函数非常复杂。Client性能更好
  • Client支持长连接
  • 可以使用swoole_select函数实现多个Client的并发控制

使用实例

$client = new Swoole\Client(SWOOLE_SOCK_TCP);
if (!$client->connect('127.0.0.1', 9501, -1)) {
    exit("connect failed. Error: {$client->errCode}\n");
}
$client->send("hello world\n");
echo $client->recv();
$client->close();

不支持apacheprework多线程模式


  • jimma

    是否支持SSL SOCKET / SERVERSOCKET

  • chd

    我到目前都不知道client运行在什么地方啊,

  • php mysql web开发

    运行在apache下又不能fork紫禁城,框架要改,是想推翻业务吗,怎么用到底怎么用,我就是想用cli方式多进程使用http实现comet技术,不用websocket,动不动就websocket,就是想用cli多进程节省服务器资源来实现反向ajax

  • 乔丹的弟弟

    在同步模式中遇到一个问题,就是client超时了,但是server端还是发送来了数据,暂定叫数据A,由于是长连接,下次请求recv的时候接收到的是数据A,而不是对应的数据B,也就是说请求包和接受包无法对应起来,不知道有什么成熟的解决方案吗

  • FMX

    Fatal error: swoole_client::__construct(): cannot use async-io in task process.

  • FMX

    如果在前端系统中,想在http_server中的task中把数据传递给另外几台服务器,想使用$client->send($data); 可是client不能在异步的IO中来使用, 那么该如何来进行处理?求教

  • FMX

    已处理,能用的,当时是初始化采用了配置文件的形式,导致类型问题,发生底层错误

  • 陈乐

    可以在发送数据的时候带上sign签名,接受到数据的时候验证sign来解决吗?

  • jm晨风

    swoole_client() 怎么向swoole_wesocket_client()上发送消息,为什么连接成功发送不消息??

  • smallbaby

    提示下$client->send("hello world\n"); 一定要加\n结束符,不然$client->recv()收不到信息,因为连接被client端主动关闭了... 14:15:36.416437 IP 10.10.10.13.56057 > 10.10.10.145.7392: Flags [S], seq 334586130, win 29200, options [mss 1460,sackOK,TS val 3693691 ecr 0,nop,wscale 7], length 0 14:15:36.424940 IP 10.10.10.145.7392 > 10.10.10.13.56057: Flags [S.], seq 3232096174, ack 334586131, win 65535, options [mss 1460,sackOK,TS val 2822591 ecr 3693691,nop,wscale 6], length 0 14:15:36.424977 IP 10.10.10.13.56057 > 10.10.10.145.7392: Flags [.], ack 1, win 229, options [nop,nop,TS val 3693693 ecr 2822591], length 0 14:15:36.425064 IP 10.10.10.13.56057 > 10.10.10.145.7392: Flags [P.], seq 1:11, ack 1, win 229, options [nop,nop,TS val 3693693 ecr 2822591], length 10 14:15:36.428558 IP 10.10.10.145.7392 > 10.10.10.13.56057: Flags [.], ack 11, win 1358, options [nop,nop,TS val 2822592 ecr 3693693], length 0 14:15:36.923899 IP 10.10.10.13.56057 > 10.10.10.145.7392: Flags [F.], seq 11, ack 1, win 229, options [nop,nop,TS val 3693818 ecr 2822592], length 0 14:15:36.932284 IP 10.10.10.145.7392 > 10.10.10.13.56057: Flags [P.], seq 1:8, ack 12, win 1358, options [nop,nop,TS val 2822693 ecr 3693818], length 7 14:15:36.932330 IP 10.10.10.13.56057 > 10.10.10.145.7392: Flags [R], seq 334586142, win 0, length 0 14:15:36.932336 IP 10.10.10.145.7392 > 10.10.10.13.56057: Flags [F.], seq 8, ack 12, win 1358, options [nop,nop,TS val 2822693 ecr 3693818], length 0 14:15:36.932343 IP 10.10.10.13.56057 > 10.10.10.145.7392: Flags [R], seq 334586142, win 0, length 0

    10.10.10.13 为client 10.10.10.145为server(未安装swoole)

  • lovejocky

    swoole_client异步连接成功后,如果是服务端主动关闭是可以实时触发onClose事件回调的,可是如果是网络出现了问题(比如说关闭网络),为什么不能立即触发onclose函数?环境为mac + php7 + swoole-1.8.11,有没有遇到同样问题的?

  • 陈玲

    在使用nginx做代理服务器时,能不能使用异步客户端swoole_client

  • 吴坎利

    怎么直接退出不监听了???

  • 王建民

    发送心跳包 每次发送前判断下 该连接是否在线

  • longmon

    网络关闭这种异常导致TCP连接的四次挥手失败,客户或服务端都不能马上得知连接断开

  • longmon

    连接未完成,正在尝试连接。多发生于异步连接,其实这不是一个错误,只是一个连接状态,表示正在进行连接 ,程序应该稍后检查连接状态

  • 李明

    receive client无法触发?

  • 初学者想学一下swoole,希望有人给予解答: 是不是一个类似网络棋牌游戏大厅这种网页游戏,服务端就可以用swoole_websocket_server? 客户端是用http_client还是直接js的websocket? 有没有大神给解释下swoole各服务器和客户端到底怎么用?以游戏大厅为例说一下整体系统架构。

  • 冰是睡着得水

    多进程下,我怎么样保存连接几个TCP的会话对像(比如: function(swoole_client $cli){ 保存$cli对像到数组,在序列化时报错误 })

  • edgeto

    https://group.swoole.com/question/107097 可以帮我看看这个问题吗?麻烦了

  • 13262732358

    这代码在终端里运行报错呀无法执行 $client = new Swoole\Client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC); $client->on("connect", function(swoole_client $cli) { $cli->send("GET / HTTP/1.1\r\n\r\n"); }); $client->on("receive", function(swoole_client $cli, $data){ echo "Receive: $data"; $cli->send(str_repeat('A', 100)."\n"); sleep(1); }); $client->on("error", function(swoole_client $cli){ echo "error\n"; }); $client->on("close", function(swoole_client $cli){ echo "Connection close\n"; }); $client->connect('127.0.0.1', 9501);

  • 13262732358

    能否支持websocket client

  • 13262732358

    异步 UDP客户端怎么写 按你的方法写报错

  • 沈唁

    111