首页 文章 使用TCP Client 调用Swoft RPC 服务

使用TCP Client 调用Swoft RPC 服务

发布时间:2019-07-26 15:57:29 作者:Soul-Yang 阅读量:680

这里用swoole_client 举个例子( swoft2.*)

法一:

$client = new \swoole_client(SWOOLE_SOCK_TCP);

if (!$client->connect('10.10.10.15', 18307, 0.5))
{
return "connect failed. Error: {$client->errCode}\n";
}

$client->send(json_encode([
"jsonrpc" => '2.0',
"method" => sprintf("%s::%s::%s", "1.2", \App\Rpc\Lib\UserInterface::class, 'getList'),
'params' => [1,2],
'id' => '',
'ext' => []
])."\r\n\r\n");// 旧版不需要追加\r\n

//或者使用字符串传递接口类名 ,上边的还可以写为,如下
$client->send(json_encode([
"jsonrpc" => '2.0',
"method" => sprintf("%s::%s::%s", "1.2", 'App\Rpc\Lib\UserInterface', 'getList'),
'params' => [1,2],
'id' => '',
'ext' => []
])."\r\n\r\n");// 旧版不需要追加\r\n

$result = $client->recv();
$client->close();
return json_decode($result,true);
法二:

$client = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($client, '127.0.0.1', 18307);
socket_write($client, json_encode([
"jsonrpc" => '2.0',
"method" => sprintf("%s::%s::%s", "1.2", \App\Rpc\Lib\UserInterface::class, 'getList'),
'params' => [1, 2],
'id' => '',
'ext' => []
]) . "\r\n\r\n");

$buf = socket_read($client, 8024);

$response = json_decode($buf, true);
return $response;

法三(官方文档)


<?php
const RPC_EOL = "\r\n\r\n";
function request($host, $class, $method, $param, $version = '1.0', $ext = []) {
$fp = stream_socket_client($host, $errno, $errstr);
if (!$fp) {
throw new Exception("stream_socket_client fail errno={$errno} errstr={$errstr}");
} $req = [
"jsonrpc" => '2.0',
"method" => sprintf("%s::%s::%s", $version, $class, $method),
'params' => $param,
'id' => '',
'ext' => $ext,
];
$data = json_encode($req) . RPC_EOL;
fwrite($fp, $data); $result = '';
while (!feof($fp)) {
$tmp = stream_socket_recvfrom($fp, 1024); if ($pos = strpos($tmp, RPC_EOL)) {
$result .= substr($tmp, 0, $pos);
break;
} else {
$result .= $tmp;
}
} fclose($fp);
return json_decode($result, true);
} $ret = request('tcp://127.0.0.1:18307', \App\Rpc\Lib\UserInterface::class, 'getList', [1, 2], "1.0");

var_dump($ret);


(以上亲测都可用)非常的简单易用, 但是需要注意一点:

1. interface 参数是服务端带命名空间的类名, 跟客户端没任何关系, 完全取决于服务端把RPC 接口类放在哪儿…

2. interface 参数 可以传字符串 ,如示例

$client = new \swoole_client(SWOOLE_SOCK_TCP);

if (! $client->connect('192.168.1.214', 8099, 0.5))
{
    return "connect failed. Error: {$client->errCode}\n";
}

$client->send(json_encode([
    "interface" => "App\Lib\MemberInterface",
    "version" => "0",
    "method" => "getMemberByID",
    "params" => [$mid],
])."\r\n");// 旧版不需要追加\r\n

$result = $client->recv();
$client->close();
return $result;

非常的简单易用, 但是需要注意一点:

interface 参数是服务端带命名空间的类名, 跟客户端没任何关系, 完全取决于服务端把RPC 接口类放在哪儿…


作者:断言
链接:http://www.imooc.com/article/details/id/278283
来源:慕课网
  
留言
https://blog.key9.cn/
用户登录
您还没有写任何评论内容!
您已经评论过了!
只能赞一次哦!
您已经收藏啦!