swoole學習第一天,SWOOLE_SOCK_TCP/UDP


前面源碼安裝完成,現在進入學習時間,順便做一些筆記

//創建server端代碼

https://wiki.swoole.com/wiki/page/14.html

<?php
//創建對象
$server = new Swoole_server('0.0.0.0',9501);

$server->set(array(
    'worker_num' => 2, //設置啟動的Worker進程數量。Swoole采用固定Worker進程的模式。
    'max_request' => 100 //此參數表示worker進程在處理完n次請求后結束運行。manager會重新創建一個worker進程。此選項用來防止worker進程內存溢出。
));

//監聽連接進入事件
/**
 * $fd 表示客戶端鏈接server的唯一標識,自增的形式
 * $reactor_id  線程標識
 */
$server->on('Connect', function ($server, $fd, $reactor_id){
    echo "Connect:{$fd} - {$reactor_id} success\n";
});

//監聽鏈接接收事件
$server->on('receive', function ($server, $fd, $from_id, $data){
    //send給客戶端發送數據 $fd 客戶端唯一標識
    //$from_id  線程ID
    $server->send($fd, "Server:{$fd} - {$from_id} - {$data}\n");
    echo 'get '.$fd .':'.$data."\n";
});

//關閉監聽事件
$server->on('Close', function ($server, $fd){
    echo "Close {$fd}\n\n";
});

$server->start();

驗證是否可用方法有多種

第一種:命令形式

root@VM-0-16-ubuntu:/data/www# telnet 127.0.0.1 9501
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
123
Server:4 - 0 - 123

 服務端輸出打印對應的輸出

Connect:4 - 0 success
get 4:123

第二種方法,使用swoole client 服務

https://wiki.swoole.com/wiki/page/29.html

//創建對象
$client = new Swoole_client(SWOOLE_SOCK_TCP);

//判斷是否連接成功,返回bool值
if (!$client->connect('127.0.0.1', 9501)){ echo "Connect error\n"; exit; }; //PHP cli常量 fwrite(STDOUT,'請輸入:'); $msg = trim(fgets(STDIN)); //發送消息給服務器 ,判斷是否發送成功 返回 bool值 if (!$client->send($msg)){ echo "send error\n"; }; //接收服務器發送的數據 $res = $client->recv(); echo $res . "\n";

肯能還有別的方法來驗證,才疏學淺只能用這兩種方式

最后,查看server的set設置是否生效可以使用ps命令查看,如修改需要重啟服務端server

root@VM-0-16-ubuntu:/data/www# ps -aft | grep tcp_server.php
13059 pts/3    S+     0:00  \_ grep --color=auto tcp_server.php
12828 pts/2    Sl+    0:00                  \_ /usr/local/php/bin/php tcp_server.php
12829 pts/2    S+     0:00                      \_ /usr/local/php/bin/php tcp_server.php
12831 pts/2    S+     0:00                          \_ /usr/local/php/bin/php tcp_server.php
12832 pts/2    S+     0:00                          \_ /usr/local/php/bin/php tcp_server.php

 

 

------------------------------

SEOOLE UDP

http://wiki.swoole.com/wiki/page/477.html

swoole的udp和tcp區別還是很大的。

UDP服務器與TCP服務器不同,UDP沒有連接的概念。啟動Server后,客戶端無需Connect,直接可以向Server監聽的9502端口發送數據包。對應的事件為onPacke。
<?php

//采用UDP方式SWOOLE_SOCK_UDP
//UDP服務器與TCP服務器不同,UDP沒有連接的概念。啟動Server后,客戶端無需Connect,直接可以向Server監聽的9502端口發送數據包。對應的事件為onPacke
$server = new Swoole_server('0.0.0.0', 9502, SWOOLE_PROCESS, SWOOLE_SOCK_UDP);

$server->set(array(
    'worker_num' => 2,
    'max_request' => 100,
));

/**
 * $data Client發送的數據
 * $clientInfo Client信息
 * UDP fd的概念。
 */

$server->on('Packet', function ($server, $data, $clientInfo){
    //這里注意tcp這里使用的是send,而UDP使用的是sendto
    //向任意的客戶端IP:PORT發送UDP數據包。
    $server->sendto($clientInfo['address'], $clientInfo['port'], "Server ".$data);
    var_dump($clientInfo);
});

$server->start();

server啟動之后,會啟動一個進程,默認不是4個,就一個主進程,來處理數據。

//'task_worker_num' => 4, //業務請求量很大,一個worker 肯定是不夠的,我們利用多個task worker的方式來改寫下server。
root@VM-0-16-ubuntu:/data/www# ps -aft | grep udp_server.php 
19316 pts/3    S+     0:00  \_ grep --color=auto udp_server.php
19304 pts/2    Sl+    0:00                  \_ /usr/local/php/bin/php udp_server.php
19305 pts/2    S+     0:00                      \_ /usr/local/php/bin/php udp_server.php
19312 pts/2    S+     0:00                          \_ /usr/local/php/bin/php udp_server.php

 

Clinet端代碼

<?php

$client = new Swoole_client(SWOOLE_SOCK_UDP);
$client->connect('127.0.0.1', 9502);

//PHP cli常量
fwrite(STDOUT,'請輸入:');
$msg = trim(fgets(STDIN));

//發送消息給服務器
if (!$client->send($msg)){
    echo "send error\n";
};

//接收服務器發送的數據
$res = $client->recv();

echo $res . "\n";

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM