swoole各種服務器區(qū)別

swoole各種服務器區(qū)別

server.php? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (推薦學習: swoole視頻教程

//創(chuàng)建Server對象,監(jiān)聽?127.0.0.1:9501端口 $serv?=?new?swooleServer("127.0.0.1",?9501);? //監(jiān)聽連接進入事件 $serv->on('Connect',?function?($serv,?$fd)?{?? ????echo?"Client:?Connect.n"; }); //監(jiān)聽數(shù)據(jù)接收事件 $serv->on('Receive',?function?($serv,?$fd,?$from_id,?$data)?{ ????$serv->send($fd,?"Server:?".$data); }); //監(jiān)聽連接關(guān)閉事件 $serv->on('Close',?function?($serv,?$fd)?{ ????echo?"Client:?Close.n"; }); //啟動服務器 $serv->start();

這里就創(chuàng)建了一個TCP服務器,監(jiān)聽本機9501端口。它的邏輯很簡單,當客戶端Socket通過網(wǎng)絡發(fā)送一個?hello?字符串時,服務器會回復一個?Server: hello?字符串。

Server是異步服務器,所以是通過監(jiān)聽事件的方式來編寫程序的。當對應的事件發(fā)生時底層會主動回調(diào)指定的函數(shù)。如當有新的TCP連接進入時會執(zhí)行onConnect事件回調(diào),當某個連接向服務器發(fā)送數(shù)據(jù)時會回調(diào)onReceive函數(shù)。

UDP服務器與TCP服務器不同,UDP沒有連接的概念。啟動Server后,客戶端無需Connect,直接可以向Server監(jiān)聽的9502端口發(fā)送數(shù)據(jù)包。對應的事件為onPacket。

$clientInfo是客戶端的相關(guān)信息,是一個數(shù)組,有客戶端的IP和端口等內(nèi)容調(diào)用?$server->sendto?方法向客戶端發(fā)送數(shù)據(jù)

Http服務器只需要關(guān)注請求響應即可,所以只需要監(jiān)聽一個onRequest事件。當有新的Http請求進入就會觸發(fā)此事件。事件回調(diào)函數(shù)有2個參數(shù),一個是$request對象,包含了請求的相關(guān)信息,如GET/POST請求的數(shù)據(jù)。

另外一個是response對象,對request的響應可以通過操作response對象來完成。$response->end()方法表示輸出一段HTML內(nèi)容,并結(jié)束此請求。

0.0.0.0?表示監(jiān)聽所有IP地址,一臺服務器可能同時有多個IP,如127.0.0.1本地回環(huán)IP、192.168.1.100局域網(wǎng)IP、210.127.20.2?外網(wǎng)IP,這里也可以單獨指定監(jiān)聽一個IP9501?監(jiān)聽的端口,如果被占用程序會拋出致命錯誤,中斷執(zhí)行。

WebSocket服務器是建立在Http服務器之上的長連接服務器,客戶端首先會發(fā)送一個Http的請求與服務器進行握手。

握手成功后會觸發(fā)onOpen事件,表示連接已就緒,onOpen函數(shù)中可以得到$request對象,包含了Http握手的相關(guān)信息,如GET參數(shù)、Cookie、Http頭信息等。

建立連接后客戶端與服務器端就可以雙向通信了。

客戶端向服務器端發(fā)送信息時,服務器端觸發(fā)onMessage事件回調(diào)服務器端可以調(diào)用$server->push()向某個客戶端(使用$fd標識符)發(fā)送消息服務器端可以設置onHandShake事件回調(diào)來手工處理WebSocket握手。

swoole_http_server是swoole_server的子類,內(nèi)置了Http的支持swoole_websocket_server是swoole_http_server的子類, 內(nèi)置了WebSocket的支持

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點贊13 分享