我目前正在尝试将图像从我的树莓派发送到我的电脑,并使用套接字库将某些内容发送回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
提交
取消