本文只简单实现使用swoole搭建UDP服务器实例,具体流程参数配置详情请参照swoole官网。
程序代码
服务器类
Udp.php
//创建server对象 监听127.0.0.1:9502端口 服务器类型为UPD
$udp = new swoole_server('127.0.0.1',9502,SWOOLE_PROCESS,SWOOLE_SOCK_UDP);
//设置服务器运行配置参数
$udp->set([
'worker_num'=>4, //进程数
'max_request'=>50 //最大请求50次数结束运行
]);
/**
* sendto方法 发送数据到客户端
* @param int address 客户端ip
* @param int port 端口号
* @param string $data 文本数据
*/
//监听数据接收事件
$udp->on('Packet',function ($udp,$data,$clientInfo){
$udp->sendto($clientInfo['address'],$clientInfo['port'],"Server ".$data);
var_dump($clientInfo);
});
//启动服务器
$udp->start();
UDP服务器与TCP服务器不同,UDP没有连接的概念。启动server后,客户端无须connect,可直接向服务器监听的9502端口发送数据,对应的事件是Packet。
- $clientInfo是客户端的相关信息,是一个数组,有客户端的IP和端口等内容
- 调用 $server->sendto方法向客户端发送数据
函数原型:
bool Server->sendto(string $ip, int $port, string $data, int $server_socket = -1);
- $ip为IPv4或IPv6字符串,如192.168.1.102。如果IP不合法会返回错误
- $port为 1-65535的网络端口号,如果端口错误发送会失败
- $data要发送的数据内容,可以是文本或者二进制内容
- $server_socket 服务器可能会同时监听多个UDP端口,此参数可以指定使用哪个端口发送数据包
客户端类
Udp_client.php
//创建swoole客户端服务 socket类型为UDP
$udp_client = new swoole_client(SWOOLE_SOCK_UDP);
//php cli常量 STDOUT
fwrite(STDOUT,'请输入消息:');
//获取客户端输入的内容数据 STDIN可以拿到在dos下输入的内容,fgets读取这个STDIN文件句柄
$msg = trim(fgets(STDOUT));
/**
* sendto方法 发送数据到server
* @param int address 客户端ip
* @param int port 端口号
* @param string $data 文本数据
*/
$send_result = $udp_client->sendto('127.0.0.1',9502,$msg);
if($send_result == false){
echo '发送数据失败!';
exit;
}
/**
* 接收服务器数据
* @param int $size 接收数据的缓存区最大长度,此参数不要设置过大,否则会占用较大内存
* @param bool $waitall 是否等待所有数据到达后返回
*/
$server_msg = $udp_client->recv($size=65535,$watill=0);
echo $server_msg;
函数原型:
swoole_client->sendto
向任意IP:PORT的主机发送UDP数据包,仅支持SWOOLE_SOCK_UDP/SWOOLE_SOCK_UDP6类型的swoole_client对象。
bool swoole_client->sendto(string $ip, int $port, string $data);
- $ip,目标主机的IP地址,支持IPv4/IPv6
- $port,目标主机端口
- $data,要发送的数据内容,不得超过64K
测试
运行Udp.php 启动UDP服务器
客户端测试 输入hello
服务端 输出客户端信息