## **一,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模式運行**

查看端口PID:lsof -i:9601

以**樹狀圖**顯示進程間的關系:`pstree -p 進程id`

說明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客戶端**
瀏覽器訪問應用地址

TCP服務端會接收客戶端上傳的數據,并返回信息

這樣就完成了簡單的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服務