亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用套接字發回數據時的代碼阻塞

使用套接字發回數據時的代碼阻塞

尚方寶劍之說 2022-09-20 17:17:59
我目前正在嘗試將圖像從我的樹莓派發送到我的電腦,并使用套接字庫將某些內容發送回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.recvclient_socket.sendallits client_socket.recv

當你從客戶端中刪除和跟隨的行時,它的工作原理是,因為這可以讓客戶端進程到達程序的末尾并退出。當客戶端退出時,它將關閉,并斷開與服務器的連接。連接斷開會導致服務器返回,但沒有數據,這會將服務器中斷循環,并允許它繼續保存之前接收的數據,然后處理圖像文件。client_socket.recvclient_socketclient_socket.recvwhile True

要修復此問題,請在客戶端調用中執行以下操作:

client_socket.shutdown(socket.SHUT_WR)

發送完所有圖像數據后。它可以在內部循環之前,也可以在 旁邊,這無關緊要。breakwhile(1)my_stream.close

這將告訴服務器不會再有數據從客戶端到達,但它仍然允許套接字沿服務器到客戶端方向傳輸數據。這將允許客戶端收集服務器的響應。pred


查看完整回答
反對 回復 2022-09-20
  • 1 回答
  • 0 關注
  • 103 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號