美文网首页
Swoole入门 - TCP 服务

Swoole入门 - TCP 服务

作者: 铁匠简记 | 来源:发表于2019-05-29 21:38 被阅读0次

    说明:机器还是之前的机器,环境还是还是之前的环境。

    手册绝对是我们学习的第一手资料,也是最有价值的资料,所以请不要丢掉它。

    首先进入之前进入我的目录

    [zhengzongqiang@localhost server]$ pwd 
    /opt/work/htdocs/swoole_mooc/demo/server
    

    创建tcp服务端文件

    [zhengzongqiang@localhost server]$ sudo vim tcp.php
    

    打开文档相关说明,并认真阅读(我必须说明:开源的框架,挣点广告费我是支持的;我的观点跟我的马赛克并不冲突)

    image

    文档还是好东西,一定要借鉴(我有认真阅读的,并且为了方便自己看效果有小的改动)

    [zhengzongqiang@localhost server]$ cat tcp.php 
    <?php
    //创建Server对象,监听 127.0.0.1:9501端口
    $serv = new swoole_server("127.0.0.1", 9501); 
    
    $serv->set([
            'worker_num' => 4, // worker 进程数,cpu的1-4倍
            'max_request'=> 10000
    ]);
    // 命令行查看server开启的worker数
    // ps aft | grep swoole_tcp_server.php
    
    //监听连接进入事件
    $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:'. $reactor_id . '  fd:' . $fd . '  data:' . $data."\n");
    });
    
    //监听连接关闭事件
    $serv->on('close', function ($serv, $fd) {
        echo "Client: {$fd} - Close.\n";
    });
    
    //启动服务器
    $serv->start(); 
    

    于是以上代码片段就被借鉴(ban)到了我们刚刚创建的tcp.php。

    保存退出后,执行此文件开启tcp服务。

    文档同样贴心的告诉我们如何验证,在新的会话中使用telnet连接服务:

    [zhengzongqiang@localhost ~]$ telnet 127.0.0.1 9501
    

    当使用telnet工具连接之后,服务端便处罚connect事件,并打印1号客户已经连接

    [zhengzongqiang@localhost server]$ php tcp.php 
    Client: 0 - 1 - Connect.
    

    在客户端发送消息hello,可以接收到server端的ack

    [zhengzongqiang@localhost ~]$ telnet 127.0.0.1 9501
    Trying 127.0.0.1...
    Connected to 127.0.0.1.
    Escape character is '^]'.
    hello
    Server: reactor_id:0  fd:1  data:hello
    

    创建tcp客户端文件 tcp.php

    进入客户端目录

    [zhengzongqiang@localhost client]$ 
    /opt/work/htdocs/swoole_mooc/demo/client
    

    创建tcp.php文件

    [zhengzongqiang@localhost client]$ sudo vim tcp.php
    

    当然,如你所想,文档中有值得我们借鉴的东西(这次只是看了文档,但为了实现telnet的效果,这里使用php cli常量)

    [zhengzongqiang@localhost client]$ cat tcp.php 
    <?php
    // 连接swoole tcp server
    $client = new swoole_client(SWOOLE_SOCK_TCP);
    
    if(!$client->connect("127.0.0.1",9501)){
            echo "连接失败";
            exit;
    }
    
    // php cli常量:STDIN:cli输入 STDOUT:cli输出
    fwrite(STDOUT,"请输入消息");
    
    // 接收用户输入
    $msg = trim(fgets(STDIN));
    
    // 发送消息给 tcp server,返回值为发送的信息长度
    $send = $client->send($msg);
    if($send){
            echo 'send'. $send."\n";
    }
    
    // 接受来自 server 的数据
    $result = $client->recv();
    echo 'recv:'. $result."\n";
    

    这时需要打开两个会话窗口,一个执行server端程序文件,一个执行client端程序文件,执行client端程序文件后,server显示1号客户端连接。

    // server
    [zhengzongqiang@localhost server]$ php tcp.php 
    Client: 0 - 1 - Connect.
    

    在客户端输入hello,可接收到server端的回复

    [zhengzongqiang@localhost client]$ php tcp.php 
    请输入消息hello
    send5
    recv:Server: reactor_id:0  fd:1  data:hello
    
    [zhengzongqiang@localhost client]$ 
    

    一个小技巧

    查看server端设置的worker数量,通过以下命令可以看到,我们设置的worker_num为4。

    [zhengzongqiang@localhost client]$ ps aft | grep tcp.php
      7353 pts/3    S+     0:00  \_ grep --color=auto tcp.php
      7281 pts/0    Sl+    0:00  \_ /opt/soft/php/bin/php tcp.php
      7282 pts/0    S+     0:00      \_ /opt/soft/php/bin/php tcp.php
      7284 pts/0    S+     0:00          \_ /opt/soft/php/bin/php tcp.php
      7285 pts/0    S+     0:00          \_ /opt/soft/php/bin/php tcp.php
      7286 pts/0    S+     0:00          \_ /opt/soft/php/bin/php tcp.php
      7287 pts/0    S+     0:00          \_ /opt/soft/php/bin/php tcp.php
    

    通过以上学习,tcp服务入门,会看文档,UDP也就会了。你会发现Swoole没那么神秘;通过后续学习你会发现,能够准确的形容Swoole的词,应该是‘酷’!

    相关文章

      网友评论

          本文标题:Swoole入门 - TCP 服务

          本文链接:https://www.haomeiwen.com/subject/tawutctx.html