swoole学习(二):TCP服务器-客户端

xcznb 2020-04-16

一、关于服务端(Swoole\Coroutine\Server):

Swoole\Coroutine\Server是完全协程化实现的,不需要设置事件回调函数。建立连接、接收数据、发送数据、关闭连接都是顺序的,没有异步风格的并发问题;可以动态的开启关闭服务,异步风格的服务在 start() 被调用之后就什么也干不了了,而协程风格的可以动态开启关闭服务。但同时,协程风格的服务不会自动创建多个进程,需要配合 Process\Pool 模块使用才能利用多核。协程风格服务其实是对 Co\Socket 模块的封装,所以用协程风格的需要对 socket 编程有一定经验。目前封装层级没有异步风格服务器那么高,有些东西需要自己手动实现,比如 reload 功能需要自己监听信号来做逻辑。

一般来说,服务端按new--set--on--start步骤进行。

二、TCP服务器:

构造函数(对应着new一个server对象):

/** * string $host 监听的地址 默认值:无 * int $port 监听的端口【如果为 0 将由操作系统随机分配一个端口】 默认值:无 * bool $ssl 是否开启 SSL 加密 默认值:false * bool $reuse_port 是否开启端口重用,效果和此节的配置一样 默认值:false 版本影响:Swoole >= v4.4.4 */
Swoole\Coroutine\Server->__construct(string $host, int $port = 0, bool $ssl = false, bool $reuse_port);

set():参数 $options 必须为一维的关联索引数组,与 setprotocol 方法接受的配置项完全一致。必须在start()前设置

Swoole\Coroutine\Server->set(array $options);

……

demo:

<?php
  $serv = new swoole_server("127.0.0.1", 9501);
  $serv->set([
     ‘worker_num‘ => 8, //worker进程数 cpu的1-4倍
     ‘max_request‘ => 10000,
  ]);
  //fd 客户端连接的唯一标识
  //reactor_id 线程ID
  $serv->on(‘connect‘, function($serv, $fd, $reactor_id){
     echo "Client: {$reactor_id}-{$fd}-Connect.\n";
  });
  $serv->on(‘receive‘, function($serv, $fd, $reactor_id, $data){
     $serv->send($fd, ‘Server: ‘.$reactor_id.‘-‘.$fd.‘ ‘.$data);
  });
  $serv->on(‘close‘, function($serv, $fd){
     echo "Client: close.\n";
  });
  $serv->start();
?>

执行demo,新开窗口监听服务,发送信息;关闭服务

swoole学习(二):TCP服务器-客户端

   以上,就是swoole中tcp服务器的一个大致流程,更多的参数和方法转到官网文档:https://wiki.swoole.com/#/server/tcp_init

三、TCP客户端:

<?php
    // 连接 swoole tcp 服务
    $client = new swoole_client(SWOOLE_SOCK_TCP);
    
    if(!$client->connect("127.0.0.1", 9501)) {
        echo "连接失败";
        exit;
    }
    
    // php cli常量
    fwrite(STDOUT, "请输入消息:");
    $msg = trim(fgets(STDIN));
    
    // 发送消息给 tcp server服务器
    $client->send($msg);
    
    // 接受来自server 的数据
    $result = $client->recv();
    echo $result;

参考官网文档:https://wiki.swoole.com/#/coroutine_client/client

相关推荐