我目前正在嘗試將圖像從我的樹莓派發送到我的電腦,并使用套接字庫將某些內容發送回PI。發送圖像的工作原理,如果我不發送一些東西。但是,如果我嘗試向PI發送響應,則兩個代碼似乎都卡住了。任何人都可以幫我這個嗎?這是我的服務器代碼:import socketserver_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)server_socket.bind(('192.168.137.1', 5005))server_socket.listen(5)import osos.environ["TF_CPP_MIN_LOG_LEVEL"] = "2" # om tekst van tensorflow import niet te laten zienimport tensorflow as tfimport cv2import matplotlib.pyplot as pltimport numpy as npmodel = tf.keras.models.load_model("C:/Users/antho/Bachelorproef/Models/(BLOK1&2&3)3-conv-128-nodes-2-dense-1585522274")print("model loaded")IMG_SIZE = 100while (1): client_socket, address = server_socket.accept() print("Connected to - ",address,"\n") fp = open("C:/Users/antho/Bachelorproef/Socket_Tests/test.jpeg",'wb') while True: strng = client_socket.recv(512) if not strng: break fp.write(strng) fp.close() print("Image received") img = cv2.imread("C:/Users/antho/Bachelorproef/Socket_Tests/test.jpeg", cv2.IMREAD_GRAYSCALE) img = cv2.resize(img, (IMG_SIZE , IMG_SIZE)) img = np.array(img).reshape(-1, IMG_SIZE, IMG_SIZE, 1) prediction = model.predict(img) print(np.argmax(prediction)) pred = str(np.argmax(prediction)) client_socket.sendall(bytes(pred, "utf-8")) print("send pred")這是我的客戶端代碼:#!/usr/bin/python# TCP client exampleimport socket,osimport ioimport timeimport picamera# Create an in-memory streammy_stream = io.BytesIO()with picamera.PiCamera() as camera: camera.start_preview() # Camera warm-up time time.sleep(0.2) camera.capture(my_stream, format='jpeg')my_stream.seek(0) # stream terug op begin zettenclient_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)client_socket.connect(('192.168.137.1', 5005))size = 1024while(1): strng = my_stream.readline(512) # print(strng) if not strng: break client_socket.send(strng)如果我注釋掉此代碼中的最后幾行,圖像將從我的計算機發送到目錄。有了它,它就會卡住。
1 回答

臨摹微笑
TA貢獻1982條經驗 獲得超2個贊
客戶端將圖像數據發送到服務器,但它不會執行任何操作來通知服務器所有圖像數據都已發送。由于服務器不知道已收到完整的圖像,因此仍在等待更多數據到達。這意味著服務器永遠不會到達調用,這意味著客戶端將永遠等待永遠不會到達的數據,因為它從未被發送過。client_socket.recv
client_socket.sendall
its client_socket.recv
當你從客戶端中刪除和跟隨的行時,它的工作原理是,因為這可以讓客戶端進程到達程序的末尾并退出。當客戶端退出時,它將關閉,并斷開與服務器的連接。連接斷開會導致服務器返回,但沒有數據,這會將服務器中斷循環,并允許它繼續保存之前接收的數據,然后處理圖像文件。client_socket.recv
client_socket
client_socket.recv
while True
要修復此問題,請在客戶端調用中執行以下操作:
client_socket.shutdown(socket.SHUT_WR)
發送完所有圖像數據后。它可以在內部循環之前,也可以在 旁邊,這無關緊要。break
while(1)
my_stream.close
這將告訴服務器不會再有數據從客戶端到達,但它仍然允許套接字沿服務器到客戶端方向傳輸數據。這將允許客戶端收集服務器的響應。pred
添加回答
舉報
0/150
提交
取消