背景概述

综合之前所学的知识点, 我们现在需要实现一个下面的任务, 客户端发送消息给服务端 B, 然后服务端 B 将消息发送给服务端 C, 然后 C 将结果返回给 B, B再把消息返回给 A, 这样的一个处理流程.
image.png

客户端A代码

case_client.php

  1. <?php
  2. // 创建一个 TCP 连接
  3. $client = new Swoole\Client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_SYNC);
  4. // 尝试连接到本地的 9501 端口
  5. if (!$client->connect('127.0.0.1', 9503, 1000)) {
  6. // 连接失败的提示信息
  7. exit("connect failed. Error: {$client->errCode}\n");
  8. }
  9. // 发送到服务端的数据
  10. $client->send("hello world\n");
  11. // 打印服务端返回的数据
  12. echo $client->recv();
  13. // 关闭连接
  14. $client->close();
  15. ?>

服务端B

case_server_and_client.php

  1. <?php
  2. // 创建Server对象,监听 9501端口
  3. $server = new Swoole\Server('0.0.0.0', 9503);
  4. // 监听连接进入事件
  5. $server->on('Connect', function ($server, $fd) {
  6. echo "Client: Connect.\n";
  7. });
  8. // 监听数据接收事件
  9. $server->on('Receive', function ($server, $fd, $from_id, $data) {
  10. echo 'client request data : ', $data;
  11. // 创建Server对象,监听 9501端口
  12. $client = new Swoole\Client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_SYNC);
  13. // 尝试连接到本地的 9501 端口
  14. if (!$client->connect('127.0.0.1', 9504, 1000)) {
  15. // 连接失败的提示信息
  16. exit("connect failed. Error: {$client->errCode}\n");
  17. }
  18. // 发送到服务端的数据
  19. $client->send("Server and Client request data \n");
  20. $result = $client->recv();
  21. echo $result."\n";
  22. $client->close();
  23. $server->send($fd, $result."\n");
  24. });
  25. // 监听连接关闭事件
  26. $server->on('Close', function ($server, $fd) {
  27. echo "Client: Close.\n";
  28. });
  29. // 启动服务器
  30. $server->start();
  31. ?>

服务端C

case_server.php

  1. <?php
  2. // 创建Server对象,监听 9501端口
  3. $server = new Swoole\Server('0.0.0.0', 9504);
  4. // 监听连接进入事件
  5. $server->on('Connect', function ($server, $fd) {
  6. echo "Client: Connect.\n";
  7. });
  8. // 监听数据接收事件
  9. $server->on('Receive', function ($server, $fd, $from_id, $data) {
  10. echo "request data : ".$data."\n";
  11. $server->send($fd, "Server response Data : server response data \n");
  12. });
  13. // 监听连接关闭事件
  14. $server->on('Close', function ($server, $fd) {
  15. echo "Client And Server : Close.\n";
  16. });
  17. // 启动服务器
  18. $server->start();
  19. ?>

执行代码

先打开服务端C, 在打开服务端B, 最后在执行客户端A

  1. [server] php case_server.php
  2. [ServerAndClient] php case_server_and_client.php
  3. [client] php case_client.php
  4. Server response Data : server response data
  5. ## 服务端 C 结果
  6. [server] php case_server.php
  7. Client: Connect.
  8. request data : Server and Client request data
  9. Client And Server : Close.
  10. ## 服务端 B 结果
  11. [ServerAndClient] php case_server_and_client.php
  12. Client: Connect.
  13. client request data : hello world
  14. Server response Data : server response data
  15. Client: Close.
  16. ## 客户端 A 结果
  17. [client] php case_client.php
  18. Server response Data : server response data