首頁 >後端開發 >Python教學 >為什麼我的 Python 套接字不發送資料而無法接收資料?

為什麼我的 Python 套接字不發送資料而無法接收資料?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-30 18:59:12494瀏覽

Why Doesn't My Python Socket Receive Data Without Sending?

Python Socket Not Receiving Without Sending

這個問題深入研究了一個問題,Python 文件中的修改後的套接字範例在發送後無法接收資料初始發送已停用。問題的出現​​是由於 TCP 套接字的固有性質,它將資料視為連續流。

在原始範例中,while 循環確保伺服器回顯收到的每個訊息。這建立了一個簡單的協議,其中發送觸發回應。

但是,在修改版本中,刪除回顯功能會破壞協定。伺服器成為資料的無限消費者,等待客戶端關閉連線。由於發送已停用,客戶端的資料既沒有被確認也沒有回顯,導致它在等待回應時掛起。

解決方案在於使客戶端的行為適應新協定。客戶端不應期望立即回應,而應優雅地關閉其連線端。這會向伺服器發出已完成發送資料的訊號,提示伺服器發送預期的「ok」訊息。

為了增強可靠性,客戶端可以使用多個 recv 呼叫來處理可能的資料碎片。此修改可確保成功接收分段訊息。

更新的範例程式碼:

伺服器

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()

客戶端

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))

遵循這些修改,此範例可確保客戶端不會掛起,伺服器會優雅地處理資料交換,即使伺服器沒有立即回應。

以上是為什麼我的 Python 套接字不發送資料而無法接收資料?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn