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

我目前正在尝试将图像从我的树莓派发送到我的电脑,并使用套接字库将某些内容发送回PI。发送图像的工作原理,如果我不发送一些东西。但是,如果我尝试向PI发送响应,则两个代码似乎都卡住了。任何人都可以帮我这个吗?


这是我的服务器代码:


import socket

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

server_socket.bind(('192.168.137.1', 5005))

server_socket.listen(5)

import os

os.environ["TF_CPP_MIN_LOG_LEVEL"] = "2"                # om tekst van tensorflow import niet te laten zien

import tensorflow as tf

import cv2

import matplotlib.pyplot as plt

import numpy as np


model = 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 = 100


while (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 example

import socket,os

import io

import time

import picamera


# Create an in-memory stream

my_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 zetten


client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

client_socket.connect(('192.168.137.1', 5005))

size = 1024


while(1):

    strng = my_stream.readline(512)

    # print(strng)

    if not strng:

        break

    client_socket.send(strng)

如果我注释掉此代码中的最后几行,图像将从我的计算机发送到目录。有了它,它就会卡住。


尚方宝剑之说
浏览 95回答 1
1回答

临摹微笑

客户端将图像数据发送到服务器,但它不会执行任何操作来通知服务器所有图像数据都已发送。由于服务器不知道已收到完整的图像,因此仍在等待更多数据到达。这意味着服务器永远不会到达调用,这意味着客户端将永远等待永远不会到达的数据,因为它从未被发送过。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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python