問題:
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中文網其他相關文章!