话不多说直接上代码
(注意 我使用的端口都是一台服务器上的,具体实现应该是跨服务器的 通过Tcp传输)
客户端
// 同步客户端
$client = new Swoole\Client(SWOOLE_SOCK_TCP);
if (!$client->connect('127.0.0.1', 5477,-1)) { // 5477端口是服务端A的
exit("connect failed. Error: {$client->errCode}\n");
}
$arr= [
'type'=>2,
'msg'=>'你好B',
'data'=>[
[
'id'=>1,
'name'=>'大喜',
'num'=>3,
],
[
'id'=>2,
'name'=>'大悲',
'num'=>39,
],
[
'id'=>3,
'name'=>'大怒',
'num'=>789,
],
]
];
$json = json_encode($arr,JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE);
$client->send($json);
echo $client->recv()."\r\n";
$client->close();
服务端A
// 服务端A ( 中转服务器 )
$serv = new Swoole\Server('0.0.0.0',5477); //监听地址 和 端口号
$serv->on('connect',function($server,$fd){
echo "Client: Connect ({$fd}).\n";
});
$serv->on('receive',function($server, $fd, $reactor_id, $data){
echo "客户端发送了消息是:".$data."\r\n";
$jsonData = json_decode($data,true);
if (!isset($jsonData['type']) || !is_array($jsonData)){
return $server->send($fd,"请求失败");
}
$serverData =[
1=>5478, // 服务器B
2=>5479, // 服务器C
];
$client = new Swoole\Client(SWOOLE_SOCK_TCP);
if (!$client->connect('127.0.0.1',$serverData[$jsonData['type']],-1)) {
exit("connect failed. Error: {$client->errCode}\n");
}
$client->send($data);
$res = $client->recv();
$client->close();
$server->send($fd,$res);
});
$serv->on('close',function($server, $fd){
echo "客户端关闭\r\n";
});
// 启动服务器
$serv->start();
服务端B
// 服务端B
$serv = new Swoole\Server('0.0.0.0',5478); //监听地址 和 端口号
$serv->on('connect',function($server,$fd){
echo "Client: Connect ({$fd}).\n";
});
$serv->on('receive',function($server, $fd, $reactor_id, $data){
echo "服务端A发来的消息是".$data."\r\n";
sleep(5);
$server->send($fd, "服务端B过滤了数据然后返回给你");
});
$serv->on('close',function($server, $fd){
echo "客户端关闭\r\n";
});
// 启动服务器
$serv->start();
服务端C
// 服务端C
$serv = new Swoole\Server('0.0.0.0',5479); //监听地址 和 端口号
$serv->on('connect',function($server,$fd){
echo "Client: Connect ({$fd}).\n";
});
$serv->on('receive',function($server, $fd, $reactor_id, $data){
echo "服务端A发来的消息是".$data."\r\n";
$server->send($fd, json_encode(['code'=>400,'msg'=>'成功']));
});
$serv->on('close',function($server, $fd){
echo "客户端关闭\r\n";
});
// 启动服务器
$serv->start();
演示图: