TCP 套接字通訊:了解套接字行為
在Python 中使用TCP 套接字時,了解這些套接字基於流的性質至關重要連接。與發送和接收操作之間的一對一關係不同,資料流由實現的協定決定。
考慮以下簡單回顯伺服器的程式碼片段:
在其原始形式中,此程式碼與客戶端建立連接,等待來自客戶端的數據,並將其回顯,直到客戶端斷開連線。循環反覆迭代,伺服器接收並回應每個傳入訊息。
但是,假設我們修改程式碼以排除伺服器將資料傳回客戶端的步驟:
在這種情況下,recv 方法的行為會改變。當修改後的伺服器與客戶端建立連線時,它會等待資料。然而,由於沒有發送數據,recv 方法會無限期地阻塞。第二次呼叫 recv 永遠不會發生,從而阻止伺服器識別客戶端的斷開連線。
要理解此行為,必須記住 TCP 套接字作為資料流進行操作。資料的發送和接收並不直接相互關聯。管理通訊的規則由實現的協定決定。在原始程式碼中,協定規定伺服器將回顯從客戶端接收到的任何資料。
經過我們的修改,協定發生了變化。伺服器現在只接收來自客戶端的資料並丟棄它。客戶端在發送資料後期望得到回應,但修改後的伺服器保持沉默。若要解決此問題,用戶端必須透過關閉其傳出連線來明確指示其已完成傳送資料。一旦發生這種情況,伺服器會收到一個空的recv調用,將其解釋為斷開連接,並繼續發送“OK”訊息。
此外,在現實場景中,資料包在傳輸過程中可能會出現碎片。考慮到這一點,更強大的客戶端實作將執行多個 recv 調用,直到收到所有資料。
以下是解決這些問題的伺服器和客戶端程式碼的更新版本問題:
伺服器:
客戶端:
透過實施這些更改,我們確保伺服器和客戶端之間的通訊按預期運行,確認斷開連接並處理資料碎片。
以上是當伺服器不回顯接收到的資料時,TCP 套接字行為如何改變?的詳細內容。更多資訊請關注PHP中文網其他相關文章!