您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關Swoole中怎么搭建TCP服務,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
通過Swoole可以快速創建一個TCP服務,新建一個文件命名為 tcp_server.php,代碼如下:
在命令行執行如下命令就可以開啟TCP服務:
php tcp_server.php
運行完命令后就可以通過 netstat 工具查看服務是否啟動成功,如果已經在監聽9501端口了,這時就可以使用 telnet/netcat 工具來連接服務器了。
telnet 127.0.0.1 9501
helloServer: hello
netstat工具使用方法:netstat -an | grep 9501
代碼邏輯分析:
通過以上代碼就可以創建一個TCP服務,監聽的端口是9501。它的邏輯很簡單,當客戶端$socket通過網絡發送一個hello字符串時,服務器端會回復一個Server:hello字符串。
Server是異步服務器,所以是同過監聽事件的方式來編寫程序的。當對應的事件發生時,底層會主動回調指定的函數。如當有洗的TCP連接金額入時,會執行 onConnect 事件回調,當某個連接向服務器發送數據時會回調 onReceive 函數。
注意事項:
服務器可以同時被成千上萬個客戶端連接,$fd 就是客戶端連接的唯一標識符
Receive 事件的回調函數中 $from_id 為線程ID
調用 $srver->send() 方法向客戶端連接發送數據,參數就是 $fd 柯達護短標識符
調用 $server->close() 方法可以強制關閉某個客戶端連接
客戶端可能會主動斷開連接,此時會觸發 onClose 事件回調
無法連接到服務器的簡單檢測手段:
在linux下,使用 netstat -an | grep 端口,查看端口是否已經被打開處于Listening狀態
上一步確認后,再檢查防火墻問題
注意服務器所用的IP地址,如果是127.0.0.1回環地址,則客戶端只能使用127.0.0.1才能連接上
用的阿里云服務器或者騰訊云服務器,需要再安全權限組進行設置開發的端口
TCP服務已經啟動,下面我們要用Swoole搭建TCP客戶端來連接TCP服務。新建一個文件,命名為 tcp_client.php,代碼如下:
上面代碼創建了一個TCP的同步客戶端,此客戶端用于連接 server.php 開啟的TCP服務。向服務端發送一個 hello world 字符串,服務器會返回一個 Server:hello world 字符串。
在命令行運行如下命令就可以連接TCP服務:
php tcp_client.php
Server:hello world
這個客戶端是同步阻塞的,connect/send/recv 會等待IO完成后再返回。同步阻塞操作并不消耗CPU資源。當IO操作未完成時,當前進程會自動轉入 sleep 模式。當IO完成后,操作系統會喚醒當前進程,繼續向下執行代碼。
流程如下:
TCP需要進行3次握手,所以connect至少需要3次網絡傳輸過程
在發送少量數據時,$client->send 都是可以立即返回的。發送大量數據時,socket 緩沖區可能會塞滿,send 操作會阻塞。
recv 操作會阻塞等待服務器返回數據,recv 耗時等于服務器處理時間+網絡傳輸耗時之和。
TCP客戶端還有一種異步非阻塞的實現形式。使用異步模式時,connect 會理解返回 true。但實際上連接并未建立。這時不能在 connect 后立即使用 send 發送數據,需要先通過isConnected() 判斷是否連接成功。當連接成功后,系統會自動回調 onConnect 函數。這時才可以使用 send 函數向服務器發送數據。
通過上面的代碼我們就實現了TCP服務端和客戶端,當服務端和客戶端建立TCP連接后,如何維持連接不斷開呢?下面我們將介紹一下基于Swoole搭建的TCP服務器心跳維持方案。
正常情況下客戶端中斷TCP連接時,會發送一個FIN包,進行4次斷開握手來通知服務器。但一些異常情況下,如客戶端突然斷電斷網或者網絡異常,服務器可能無法得知客戶端已斷開連接。尤其是異動網絡,TCP連接非常不穩定,所以需要一套機制來保證服務器和客戶端之間的連接的有效性。
Swoole擴展本身內置了這種機制,開發者只需要配置一個參數即可啟用。Swool在每次收到客戶端數據會記錄一個時間戳,當客戶端在一定時間內未向服務器端發送數據,那服務器會自動切斷連接。
配置方法如下:
上面的設置就是每5秒偵測一次心跳,一個TCP連接如果再10秒內未向服務器發送數據,連接將會被切斷。
通過以上案例我們對Swoole的事件驅動模型有了一定的了解。下面我們將詳細介紹Swoole的回調事件。
事件執行順序
所有事件回調均在 $server->start 后發生
服務器關閉程序終止時最后一次事件是 onShutdown
服務器啟動成功后,onStart /onManagerStart / onWorkerStart 會在不同的進程內并發執行
onReceive / onConnect / onClose 在 Worker 進程中觸發
Worker / Task 進程啟動/結束時會分別調用一次 onWorkerStart / onWorkerStop
onTask 事件僅在 task 進程中發生onFinish 事件僅在 Worker進程中發生
以上就是Swoole中怎么搭建TCP服務,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。