我已經使用 python 實作了一個套接字服務器和客戶端。想法是簡單地將影像從客戶端發送到服務器并從服務器回傳文本訊息。客戶端將從檔案系統中選擇一個影像檔案(.jpg)并發送到服務器。服務器將接收它并用不同的名稱(當前日期時間戳)保存它,然后發回處理過的文本訊息。影像在服務器端成功發送并保存,但問題是當.recv()呼叫方法從服務器獲取訊息時客戶端掛起。
以下是代碼
服務器
import socket
import datetime
import time
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(("127.0.0.1",12345))
server.listen()
print("Server started and listening at port 12345")
BUFFER_SIZE=4096
while True:
client_socket, address = server.accept();
# client_socket.setblocking(False)
print(f"Connection from {address} has been established.")
file_name = str(datetime.datetime.now()).replace(" ", "").replace(":", "-")
file_name = file_name ".jpg"
with open(file_name, "wb") as file:
recv_data = client_socket.recv(BUFFER_SIZE)
while (recv_data):
file.write(recv_data)
recv_data = client_socket.recv(BUFFER_SIZE)
print("File writing done, preapring data to send...")
client_socket.send(bytes("Hey there!!!", "utf-8"))
client_socket.close()
客戶
import socket
import threading
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(("127.0.0.1", 12345))
BUFFER_SIZE = 4096
with open("client_file.jpg", 'rb') as file:
file_data = file.read(BUFFER_SIZE)
while (file_data):
client.send(file_data)
file_data = file.read(BUFFER_SIZE)
msg = client.recv(1024) # <-------[[[ hangs here ]]]
print(msg.decode("utf-8"))
uj5u.com熱心網友回復:
由于客戶端和服務器都在等待對方發送資料,因此存在死鎖。服務器正在讀取輸入直到流結束:client_socket.recv如果連接仍然打開但客戶端沒有發送更多資料,服務器將掛起。同時客戶端正在等待服務器發送一些東西,即client.recv掛起。
似乎有一個假設,client_socket.recv一旦客戶端完成發送,就會回傳沒有資料。不是這種情況。只有當客戶端關閉連接或有新資料可用時,它才會回傳。處理此問題的常用方法是在傳輸完成時獲取一些資訊,例如在傳輸前加上大小或進行單向關閉。
uj5u.com熱心網友回復:
您需要client.shutdown(socket.SHUT_WR)在發送影像后告訴服務器您已完成發送。之后它會像微風一樣作業
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/462595.html
