## **一,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客户端的搭建!