## **一,UDP服務器創建**
```
<?php
// +----------------------------------------------------------------------
// | najing [ 通用后臺管理系統 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2020 http://www.najingquan.com All rights reserved.
// +----------------------------------------------------------------------
// | Author: 救火隊隊長
// +----------------------------------------------------------------------
namespace server;
/**
* 概要描述:UDP服務器
* @author: 救火隊隊長
* @since: 2020-05-23 22:45
*/
class UdpServer
{
protected $serv = null; //Swoole\Server對象
protected $host = '0.0.0.0'; //監聽對應外網的IP 0.0.0.0監聽所有ip
protected $port = 9602; //監聽端口號
public function __construct()
{
$this->serv = new \Swoole\Server($this->host, $this->port, SWOOLE_PROCESS, SWOOLE_SOCK_UDP);
//設置參數
//如果業務代碼是全異步 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】
));
//監聽數據接收事件
// 3、設置回調,發生在worker進程中
$this->serv->on('packet', function ($serv, $data, $client_info) {
echo "接收到客戶端信息: " . $data . PHP_EOL;
var_dump($client_info);
// 由于UDP協議不能確保信息送達,所以當服務端收到信息后最好做個應答,這樣客戶端才有依據來做判斷
$this->serv->sendto($client_info['address'], $client_info['port'], "This is server..." . PHP_EOL);
});
//啟動服務
$this->serv->start();
}
}
$udpServer = new UdpServer();
```
## **二,運行UDP服務**
>[danger] **需要用php CLI模式運行**

**查看進程數:ps aft | grep? /home/server/UdpServer.php**

說明UDP服務已正常開啟
## **三,創建UDP客戶端(TP6舉例)**
```
<?php
// +----------------------------------------------------------------------
// | najing [ 通用后臺管理系統 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2020 http://www.najingquan.com All rights reserved.
// +----------------------------------------------------------------------
// | Author: 救火隊隊長
// +----------------------------------------------------------------------
namespace app\admin\controller;
use app\BaseController;
class UdpClient extends BaseController
{
public function demo()
{
// 創建UDP客戶端
$client = new \Swoole\Client(SWOOLE_SOCK_UDP, SWOOLE_SOCK_SYNC);
// 發送消息
$client->sendto('212.64.29.192', 9602, "I am client..." . PHP_EOL);
// 打印服務端返回的消息
echo $client->recv() . PHP_EOL;
exit();
}
}
```
## **三,運行UDP客戶端**
瀏覽器訪問應用地址

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

這樣就完成了簡單的udp服務器與udp客戶端的搭建!
- 安裝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服務