日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

tcp连接工具_基于Swoole如何搭建TCP服务,你掌握了吗?

發布時間:2024/7/19 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 tcp连接工具_基于Swoole如何搭建TCP服务,你掌握了吗? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本節將會講解以下3個問題:

  • 通過Swoole如何搭建TCP服務?
  • 通過Swoole如何搭建TCP客戶端?
  • 通過Swoole搭建的TCP服務,更深入理解Swoole的事件驅動模式

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

tcp_server.php

在命令行執行如下命令就可以開啟TCP服務:

php tcp_server.php

運行完命令后就可以通過 netstat 工具查看服務是否啟動成功,如果已經在監聽9501端口了,這時就可以使用 telnet/netcat 工具來連接服務器了。

telnet 127.0.0.1 9501helloServer: 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_client.php

上面代碼創建了一個TCP的同步客戶端,此客戶端用于連接 server.php 開啟的TCP服務。向服務端發送一個 hello world 字符串,服務器會返回一個 Server:hello world 字符串。

在命令行運行如下命令就可以連接TCP服務:

php tcp_client.phpServer: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進程中發生

事件函數介紹

  • onStart
  • onShutdown
  • onWorkerStart
  • onWorkerStop
  • onWorkerExit
  • onConnect
  • onReceive
  • onPacket
  • onClose
  • onTask
  • onFinish
  • onPipeMessage
  • onWorkerError
  • onManagerStart
  • onManagerStop

作為web開發的佼佼者PHP并不遜色其他語言,加上swoole后更加是如虎添翼!進軍通信 、物聯網行業開發百度地圖、百度訂單中心等!年后更是霸占程序員招聘語言第二名,寒冬裁員期過后正是各大企業擴大招人的時期,現在市場初級程序員泛濫,進階中高級程序員絕對是各大企業急需的人才,這套教程適合那些1-6年的PHP開發者進階中高級提升自己,在金九銀十中找到高薪職位!

領取方式:點贊關注小編后私信【資料】獲取資料領取方式!

部分資料展示:

領取方式:點贊關注小編后私信【資料】獲取資料領取方式!

總結

以上是生活随笔為你收集整理的tcp连接工具_基于Swoole如何搭建TCP服务,你掌握了吗?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。