亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Swoole中怎么搭建TCP服務

發布時間:2021-08-10 15:32:55 來源:億速云 閱讀:135 作者:Leah 欄目:大數據

本篇文章給大家分享的是有關Swoole中怎么搭建TCP服務,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

通過Swoole可以快速創建一個TCP服務,新建一個文件命名為 tcp_server.php,代碼如下:

Swoole中怎么搭建TCP服務

在命令行執行如下命令就可以開啟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,代碼如下:

Swoole中怎么搭建TCP服務

上面代碼創建了一個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在每次收到客戶端數據會記錄一個時間戳,當客戶端在一定時間內未向服務器端發送數據,那服務器會自動切斷連接。

配置方法如下:

Swoole中怎么搭建TCP服務

上面的設置就是每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服務,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

泸西县| 东丽区| 澳门| 珠海市| 思茅市| 子洲县| 仲巴县| 永靖县| 海晏县| 巴东县| 五常市| 洛浦县| 武陟县| 苗栗市| 衡阳县| 泸水县| 南陵县| 年辖:市辖区| 双牌县| 临漳县| 成武县| 贞丰县| 洛阳市| 卫辉市| 广州市| 桐柏县| 浙江省| 衡山县| 锡林郭勒盟| 胶州市| 同江市| 萝北县| 奎屯市| 揭东县| 正蓝旗| 泾源县| 红安县| 舒兰市| 九龙县| 铁岭市| 金川县|