## **一,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模式运行**
![](https://img.kancloud.cn/50/97/5097da7d0b67b0dc546f821194a60e82_469x37.png)
**查看进程数:ps aft | grep /home/server/UdpServer.php**
![](https://img.kancloud.cn/b6/2f/b62f4c9e24174b3af7b667fb89554502_565x126.png)
说明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客户端**
浏览器访问应用地址
![](https://img.kancloud.cn/52/ef/52ef3a6a2581dde764a921f4e7ea4b04_575x117.png)
UDP服务端会接收客户端上传的数据,并返回信息
![](https://img.kancloud.cn/fd/e8/fde8a75a447afe7d6e467f4642237d75_610x195.png)
这样就完成了简单的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服务