<?php
// +----------------------------------------------------------------------
// | Bwsaas
// +----------------------------------------------------------------------
// | Copyright (c) 2015~2020 http://www.buwangyun.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Gitee ( https://gitee.com/buwangyun/bwsaas )
// +----------------------------------------------------------------------
// | Author: buwangyun <hnlg666@163.com>
// +----------------------------------------------------------------------
// | Date: 2020-9-28 10:55:00
// +----------------------------------------------------------------------

namespace buwang\util;

/**
 * RPC请求类
 */
class RpcClient
{
    public function send(string $serve, array $data = [], callable $callback = null)
    {

        //$raw = serialize($data);//注意序列化类型,需要和RPC服务端约定好协议 $serializeType
        try {
            $raw = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);

            $fp = stream_socket_client($serve);
            fwrite($fp, pack('N', strlen($raw)) . $raw);//pack数据校验

            $data = fread($fp, 65533);
            //做长度头部校验
            $len = unpack('N', $data);
            $data = substr($data, '4');
            if (strlen($data) != $len[1]) {
                if (!is_null($callback)) {
                    call_user_func_array($callback, []);
                }
            } else {
                $data = json_decode($data, true);
                //    //这就是服务端返回的结果,
                //var_dump($data);//默认将返回一个response对象 通过$serializeType修改
                if (!is_null($callback)) {
                    call_user_func_array($callback, $data);
                }
            }
            fclose($fp);
        } catch (\think\exception\ErrorException $e) {
            echo $e->getMessage();
            echo '<hr/>';
        }

    }
}