代码改变世界

Swoole 中使用 UDP 异步服务器、UDP 同步客户端、UDP 协程客户端

2020-06-26 10:14  小伍2013  阅读(694)  评论(0编辑  收藏  举报

UDP 异步风格服务器

# udp_server.php

// 创建 UDP 服务器对象,监听0.0.0.0:9502端口,类型为SWOOLE_SOCK_UDP
$serv = new Swoole\Server("0.0.0.0", 9502, SWOOLE_PROCESS, SWOOLE_SOCK_UDP); 

// 设置服务器运行参数
$serv->set(array(
    'daemonize'     => 1,  // 作为守护进程运行,需同时设置log_file
    'log_file'      => '/www/logs/swoole.log',  // 指定标准输出和错误日志文件
));

// 监听数据接收事件
// $clientInfo数组是客户端的相关信息,有客户端的 IP 和端口等内容
$serv->on('Packet', function ($serv, $data, $clientInfo) {
    // 向客户端发送数据
    $serv->sendto($clientInfo['address'], $clientInfo['port'], "Server: " . $data);
    var_dump($clientInfo);
});

// 启动服务器
$serv->start();

运行并测试 UDP 异步风格服务器

# 如果程序已经运行,先结束进程
kill -9 11591

# 在 cli 命令行环境运行服务端
php udp_server.php

# 查看服务器监听的端口
netstat -an | grep 9501

# 使用netcat测试连接服务端
netcat -u 127.0.0.1 9502
# 发送数据
hello
# 接收数据
Server: hello

UDP 没有协程风格服务器

UDP 同步阻塞客户端

// 同步阻塞客户端可以用于 PHP-FPM 环境下
// UDP不存在连接的概念,也没有异步
$client = new Swoole\Client(SWOOLE_SOCK_UDP, SWOOLE_SOCK_SYNC);
$client->sendto('127.0.0.1', 9502, "hello world\n");
echo $client->recv();

UDP 协程客户端

// 设置要 Hook 的函数的范围
Co::set(['hook_flags'=> SWOOLE_HOOK_ALL]);

// 协程客户端,底层自动使用协程调度实现异步IO,用于代替异步客户端
Co\run(function(){
  $client = new Swoole\Coroutine\Client(SWOOLE_SOCK_UDP);
  
  $client->set(array(
    'timeout' => 1.5,          //总超时,包括连接、发送、接收所有超时
    'write_timeout' => 2.0,    //发送超时,会覆盖第一个总的 timeout
    'read_timeout' => 0.5,     //接收超时,会覆盖第一个总的 timeout
  ));

  $client->sendto('127.0.0.1', 9502, "hello world\n");
  echo $client->recv();
});