我想使用套接字在服務器和客戶端之間實作一個簡單的雙向通信。客戶端發送訊息并等待回復。服務器讀取訊息并回復適當的結果。我有下面的代碼,但它們都被掛起。你能解釋一下這里有什么問題嗎?
服務器:
import socket
import time
HOST = "127.0.0.1"。
埠=18735
#創建套接字并監聽。
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen()
print(f "Listening on {HOST}:{PORT}"/span>)
# accept connection
conn, addr = s.accept()
print(f "Accepted connection from {HOST}:{PORT}"/span>)
cmd = ""/span>
while True:
data = conn.recv(2)
time.sleep(1)
if not data:
break not data.
print(data.decode())
# conn.sendall(b "OK") 這一行解決了這個問題!
conn.sendall(b "Finished")
s.close()
客戶端:
import socket
HOST = "127.0.0.1"/span>
埠 = 18735
#創建socket并連接
cs = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
cs.connect((HOST, PORT))
#發送資料
cs.sendall(b "123456"/span>)
# 等候結果
data = cs.recv(1024)
print("result: "/span>, data)
cs.close()
編輯。 現在,我可以通過從服務器發送短訊息來解決這個問題。然而,我想知道這是否有必要?
uj5u.com熱心網友回復:
服務器不會跳出其while回圈,直到客戶端斷開連接或至少關閉其連接的寫入部分(使用cs.shutdown(socket.SHUT_WR))。
客戶端將不會斷開連接,直到它收到來自服務器的訊息,而服務器在 while 回圈之外發送該訊息(即在客戶端斷開連接/關閉其連接的寫入部分之后)。
你已經創建了一個死鎖。
從根本上說,你已經創建了一個死鎖。
從根本上說,問題在于等到客戶端斷開連接后再向該客戶端發送回應是毫無意義的。要么客戶需要不期望得到回應,要么服務器需要在客戶仍在連接時發送回應。在后者的情況下,你可能需要實作以下內容之一:
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/311828.html
標籤:
