为了账号安全,请及时绑定邮箱和手机立即绑定

使用套接字发回数据时的代码阻塞

使用套接字发回数据时的代码阻塞

尚方宝剑之说 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 关注
  • 94 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信