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();
});
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/20943.html
標籤:PHP
