zoukankan      html  css  js  c++  java
  • 分析easyswoole3.0源码,consoleTcpService(六)

    前文讲过可以通过配置开启一个tcp服务,叫做consoleTcpservice。EasySwooleEasySwooleCore::83行

    (new TcpService(Config::getInstance()->getConf('CONSOLE')));  

    这个就是一个console的Tcp子服务。然后可以自定义客户端去和主服务通信。

    注意了源码注册了一个TcpParser,EasySwooleEasySwooleConsoleTcpParser 这个解析器要求了数据的分包规则。

    在 EasySwooleEasySwooleConsoleTcpController 下实现一个help方法,这个是当数据错误非json请求的时候返回的。 TcpParser::decode方法会对解析到的数据进行jsondecode,如果不是array就会默认匹配help的Action。

    public function decode($raw, $client): ?Caller
        {
            // TODO: Implement decode() method.
            Logger::getInstance()->console($raw);
            $caller =  new Caller();
            $data = self::unpack($raw);
            $arr = json_decode($data,true);
            if(!is_array($arr)){
                $arr = [
                    'action'=>'help',
                    'controller'=>TcpController::class,
                    'args'=>[
                    ]
                ];
            }else{
                $arr['controller'] = TcpController::class;
            }
            $caller->setAction($arr['action']);
            $caller->setControllerClass($arr['controller']);
            $caller->setArgs($arr['args']);
            return $caller;
        }

     付上一个客户端脚本,仅仅是测试所用

    <?php
    function mpack(string $data):string
    {
    	return pack('N', strlen($data)).$data;
    }
    
    function munpack(string $data):string
    {
    	return substr($data,'4');
    }
    $client = new swoole_client(SWOOLE_SOCK_TCP);
    
    //连接到服务器
    if (!$client->connect('127.0.0.1', 9502, 0.5))
    {
        die("connect failed.");
    }
    $data = ['action'=>'hostIp', 'args'=>[
                    ]];
    $poststr = mpack(var_export($data,true));				
    //$poststr = mpack(json_encode($data));
    //向服务器发送数据
    if (!$client->send($poststr))
    {
        die("send failed.");
    }
    //从服务器接收数据
    $data = $client->recv();
    if (!$data)
    {
        die("recv failed.");
    }
    print_r(munpack($data));
    //关闭连接
    $client->close();
    

    当错误解析的时候会被解析到help方法。如果正确的话,那就按照上面的脚本去掉

    //$poststr = mpack(json_encode($data));

    再次运行,就会获取到ip地址了EasySwooleEasySwooleConsoleTcpController::hostIp

    其实最主要的命令还是那么几个控制开关和reload的命令

  • 相关阅读:
    BF算法和KMP算法
    Python课程笔记 (五)
    0268. Missing Number (E)
    0009. Palindrome Number (E)
    0008. String to Integer (atoi) (M)
    0213. House Robber II (M)
    0198. House Robber (E)
    0187. Repeated DNA Sequences (M)
    0007. Reverse Integer (E)
    0006. ZigZag Conversion (M)
  • 原文地址:https://www.cnblogs.com/gavinjunftd/p/9871246.html
Copyright © 2011-2022 走看看