一、UDP服务端
<?php
/**
* +----------------------------------------------------------
* date: 2019\8\26 0026 21:23
* +----------------------------------------------------------
* author: Raoxiaoya
* +----------------------------------------------------------
* describe: UDP服务
* +----------------------------------------------------------
*/
// 1、建立对象
$server = new Swoole\Server('0.0.0.0', 9002, SWOOLE_PROCESS, SWOOLE_SOCK_UDP);
// 2、设置运行时
$server->set([
'worker_num' => 4,// 初始工作进程数
'daemonize' => false,// 后台运行
]);
// 3、设置回调,发生在worker进程中
$server->on('packet', function ($server, $data, $client_info) {
echo "接收到客户端信息: " . $data . PHP_EOL;
var_dump($client_info);
// 由于UDP协议不能确保信息送达,所以当服务端收到信息后最好做个应答,这样客户端才有依据来做判断
$server->sendto($client_info['address'], $client_info['port'], "This is server..." . PHP_EOL);
});
// 4、启动
$server->start();
netstat -lntp 居然没看到 9002 端口的监听,原来此命令只查看 tcp,tcp6 的服务。
改用 netstat -anp | grep 9002 可以查看全部的服务
二、UDP同步客户端:
<?php
/**
* +----------------------------------------------------------
* date: 2019\8\26 0026 21:36
* +----------------------------------------------------------
* author: Raoxiaoya
* +----------------------------------------------------------
* describe: UDP同步客户端
* +----------------------------------------------------------
*/
$client = new Swoole\Client(SWOOLE_SOCK_UDP, SWOOLE_SOCK_SYNC);
$client->sendto('127.0.0.1', 9002, "I am client...".PHP_EOL);
echo $client->recv();
echo PHP_EOL;
// 脚本执行完就结束进程了,不像tcp客户端那样还保持着连接。
三、UDP异步客户端:
<?php
/**
* +----------------------------------------------------------
* date: 2019\8\26 0026 22:33
* +----------------------------------------------------------
* author: Raoxiaoya
* +----------------------------------------------------------
* describe: UDP异步客户端
* +----------------------------------------------------------
*/
$client = new Swoole\Client(SWOOLE_SOCK_UDP, SWOOLE_SOCK_SYNC);
$client->sendto('127.0.0.1', 9002, "I am client...".PHP_EOL);
$client->on('receive', function($client, $data){
echo "receive data from server: " . $data . PHP_EOL;
});
$client->on('error', function($client){
echo "client error: " . $client->errCode . PHP_EOL;
});
php udp_client_async.php
服务端可以收到信息,但是客户端直接报错中断了,待解决
ERROR swReactorEpoll_del(:151): epoll remove fd[4#0] failed. Error: No such file or directory[2].