首頁 > 後端開發 > Python教學 > 為什麼我的 Python 套接字在第一次 `recv()` 呼叫後不接收數據,除非我修改客戶端?

為什麼我的 Python 套接字在第一次 `recv()` 呼叫後不接收數據,除非我修改客戶端?

Susan Sarandon
發布: 2024-11-28 20:10:16
原創
589 人瀏覽過

Why Doesn't My Python Socket Receive Data After the First `recv()` Call Unless I Modify the Client?

Python Socket 不傳送資料就無法接收資料

問題:

Python 的 socket.方法不傳回編輯回顯伺服器程式碼後第二次呼叫時的數據,以避免將資料傳回client.

分析:

TCP 套接字作為資料流運行,發送和接收呼叫之間缺乏一對一的關聯。最初的程式碼遵循特定的協議,其中伺服器準確地發送回收到的數據,直到客戶端關閉連接。

修改改變了規則,導致伺服器不斷接收和丟棄數據,直到客戶端回應為止結束了他們的結局。客戶端因期望立即回應而無限期掛起。

解決方案:

要解決此問題,客戶端必須調整其行為以符合修改後的伺服器協定。

  • 客戶端修改:

    關閉套接字的傳出端以發出完成訊號,允許伺服器發送回應。實作多個 recv() 操作以處理潛在的資料碎片。

  • 更新的客戶端程式碼:
import socket

HOST = 'localhost'
PORT = 50007
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.sendall(b'Hello, world')
s.shutdown(socket.SHUT_WR)
data = b''
while True:
    buf = s.recv(1024)
    if not buf:
        break
    data += buf
s.close()
print('Received', repr(data))
登入後複製
  • 更新了伺服器代碼:

    維護更改後的協議,一旦客戶端關閉傳入連接就發送“ok”。

import socket

HOST = ''
PORT = 50007 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((HOST, PORT))
s.listen(1)

conn, addr = s.accept()
print('Connected by', addr)

while True:
    data = conn.recv(1024)
    if not data: break
conn.sendall(b'ok')
conn.shutdown(socket.SHUT_WR)
conn.close()
登入後複製

以上是為什麼我的 Python 套接字在第一次 `recv()` 呼叫後不接收數據,除非我修改客戶端?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板