## **一,TCP服务器创建** ``` <?php // +---------------------------------------------------------------------- // | najing [ 通用后台管理系统 ] // +---------------------------------------------------------------------- // | Copyright (c) 2020 http://www.najingquan.com All rights reserved. // +---------------------------------------------------------------------- // | Author: 救火队队长 // +---------------------------------------------------------------------- namespace server; /** * 概要描述:TCP服务器 * @author: 救火队队长 * @since: 2020-05-23 22:45 */ class TcpServer { protected $serv = null; //Swoole\Server对象 protected $host = '0.0.0.0'; //监听对应外网的IP 0.0.0.0监听所有ip protected $port = 9601; //监听端口号 public function __construct() { $this->serv = new \Swoole\Server($this->host, $this->port); //设置参数 //如果业务代码是全异步 IO 的,worker_num设置为 CPU 核数的 1-4 倍最合理 //如果业务代码为同步 IO,worker_num需要根据请求响应时间和系统负载来调整,例如:100-500 //假设每个进程占用 40M 内存,100 个进程就需要占用 4G 内存 $this->serv->set(array( 'worker_num' => 4, //设置启动的worker进程数。【默认值:CPU 核数】 'max_request' => 10000, //设置每个worker进程的最大任务数。【默认值:0 即不会退出进程】 'daemonize' => 0, //守护进程化【默认值:0】 )); //监听链接进入事件 $this->serv->on('connect', function ($serv, $fd) { echo '链接成功'; }); //监听数据接收事件 $this->serv->on('receive', function ($serv, $fd, $from_id, $data) { var_dump($fd.'--'.$data); /** * 函数:bool Server->send(mixed $fd, string $data, int $serverSocket = -1); * 作用:向客户端发送数据 * 参数: * $fd,客户端的文件描述符 * $data,发送的数据,TCP协议最大不得超过2M,可修改 buffer_output_size 改变允许发送的最大包长度 * $serverSocket,向Unix Socket DGRAM对端发送数据时需要此项参数,TCP客户端不需要填写 */ $this->serv->send($fd, "服务端向用户{$fd}发送数据:{$data}"); }); //监听链接关闭事件 $this->serv->on('close', function ($serv, $fd) { echo '关闭链接'; }); //启动服务 $this->serv->start(); } } $tcpServer = new TcpServer(); ``` ## **二,运行TCP服务** >[danger] **需要用php CLI模式运行** ![](https://img.kancloud.cn/53/8c/538cc3ba4e5aca118cfb7c376d2d82af_522x35.png) 查看端口PID:lsof -i:9601 ![](https://img.kancloud.cn/6b/6f/6b6fa14dae3b7b4715f4978f14032fd2_534x66.png) 以**树状图**显示进程间的关系:`pstree -p 进程id` ![](https://img.kancloud.cn/1c/cd/1ccd356181b2c0d9dfa9c0cdf30a6b8b_620x108.png) 说明TCP服务已正常开启 ## **三,创建TCP客户端(TP6举例)** ``` <?php // +---------------------------------------------------------------------- // | najing [ 通用后台管理系统 ] // +---------------------------------------------------------------------- // | Copyright (c) 2020 http://www.najingquan.com All rights reserved. // +---------------------------------------------------------------------- // | Author: 救火队队长 // +---------------------------------------------------------------------- namespace app\admin\controller; use app\BaseController; class TcpClient extends BaseController { public function demo() { // 创建TCP客户端 $client = new \Swoole\Client(SWOOLE_SOCK_TCP); /** * 函数:bool Client->connect(string $host, int $port, float $timeout = 0.5) * 作用:连接到服务器 * 参数: * $host,远程服务器的地址 * $port,远程服务器端口 * $timeout,网络 IO 的超时时间 */ if (!$client->connect('212.64.29.192', 9601, 0.5)) { die("connect failed."); } //向服务器发送数据 if (!$client->send("hello world")) { echo '发送失败'; } //从服务器接收数据 $data = $client->recv(); if (!$data) { die("recv failed."); } //打印从服务端接收到的数据 echo $data; //关闭连接 $client->close(); exit(); } } ``` ## **三,运行TCP客户端** 浏览器访问应用地址 ![](https://img.kancloud.cn/3f/92/3f921844265a9d8f6cac98d65ecd62d9_701x192.png) TCP服务端会接收客户端上传的数据,并返回信息 ![](https://img.kancloud.cn/c9/95/c995a2f91fcc24007cc7ce495e58de8d_623x127.png) 这样就完成了简单的tcp服务器与tcp客户端的搭建!