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


    一、关于服务端(SwooleCoroutineServer):

      SwooleCoroutineServer是完全协程化实现的,不需要设置事件回调函数。建立连接、接收数据、发送数据、关闭连接都是顺序的,没有异步风格的并发问题;可以动态的开启关闭服务,异步风格的服务在 start() 被调用之后就什么也干不了了,而协程风格的可以动态开启关闭服务。但同时,协程风格的服务不会自动创建多个进程,需要配合 ProcessPool 模块使用才能利用多核。协程风格服务其实是对 CoSocket 模块的封装,所以用协程风格的需要对 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
    */
    SwooleCoroutineServer->__construct(string $host, int $port = 0, bool $ssl = false, bool $reuse_port);

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

    SwooleCoroutineServer->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.
    ";
      });
      $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.
    ";
      });
      $serv->start();
    ?>

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

       以上,就是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

     四、UDP服务器、客户端

      与TCP类似,参数改变

    慢慢来才是最快的
  • 相关阅读:
    IDEA 远程调试springboot
    Mybatitas-plus实现逻辑删除
    java通过poi导出excel
    js 展示当前时间
    Linux环境下服务自启
    Spring自带定时器@Scheduled
    Quartz任务调度框架相关方法、参数理解
    Quartz 实现定时任务
    mysql 使用union(all) + order by 导致排序失效
    mongodb的查询操作
  • 原文地址:https://www.cnblogs.com/jongty/p/12709707.html
Copyright © 2020-2023  润新知