## **一,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客户端的搭建!
- 安装Swoole
- swoole基础-TCP服务
- swoole基础-UDP服务
- swoole基础-HTTP服务
- swoole基础-WebSocket服务
- swoole基础-TASK异步任务
- swoole基础-一键协程
- swoole基础-协程 MySQL 客户端
- swoole基础-协程 Redis 客户端
- swoole基础-毫秒定时器
- swoole基础-高性能内存操作table
- think-swoole应用-HTTP请求和热更新
- think-swoole应用-进程设置
- think-swoole应用-启用数据库连接池
- think-swoole应用-异步TASK发送短信任务
- think-swoole应用-集成think-queue消息队列,优化异步发短信任务,支持任务重试机制
- think-swoole应用-毫秒定时器取消超时订单
- think-swoole应用-高性能共享内存table应用
- think-swoole应用-微服务之RPC远程调用通信实战
- think-swoole应用-websocket消息、群发广播
- Nginx负载均衡部署-转发swoole服务