Python3 Отсутствуют данные об изображении Socket Server - PullRequest
0 голосов
/ 26 апреля 2020

Я отправляю данные (изображения и картинки) через сервер сокетов с ноутбука на raspberry pi в python3 .7, и он отлично работает, когда клиент и сервер находятся на одном устройстве (ноутбуке) Однако, когда передача происходит между компьютером и Raspberry Pi, изображение теряет около половины данных. Независимо от того, сколько раз я пытаюсь или сколько раз меняю считанные байты, выводятся одни и те же неполные изображения:

Вот входные картинки, которые я тестировал с

enter image description here

enter image description here

и вот фотографии после того, как я отправил их в rpi, и они получили обратно:

enter image description here

enter image description here

Вот мой код сервера:

#!/usr/bin/env python

import random
import socket, select
from time import gmtime, strftime
from random import randint

imgcounter = 1
basename = "image8.jpg"

HOST = '0.0.0.0'
PORT = 9999

connected_clients_sockets = []

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

server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind((HOST, PORT))
server_socket.listen(10)

connected_clients_sockets.append(server_socket)

while True:
    read_sockets, write_sockets, error_sockets = select.select(connected_clients_sockets, [], [])

    for sock in read_sockets:

        if sock == server_socket:

            sockfd, client_address = server_socket.accept()
            connected_clients_sockets.append(sockfd)

        else:
            try:

                data = sock.recv(4096)
                try:
                    txt = data.decode(encoding = 'UTF-16',errors = 'strict')
                except:
                    txt = ""
                #txt = str(data)
                if data:
                    #print("recieved data",data.decode(encoding = 'UTF-16',errors = 'strict'))
                    if txt == 'SIZE 11907' :
                        print("correct")
                    if txt.startswith('SIZE'):
                        print('size?')
                        tmp = txt.split()
                        size = int(tmp[1])

                        print ('got size')

                        sock.sendall("GOT SIZE".encode(encoding = 'UTF-16',errors = 'strict'))
                        print ("done sending")
                    elif txt.startswith('BYE'):
                        print('bye')
                        sock.shutdown()

                    else :
                        print('image maybe')
                        myfile = open(basename, 'wb')
                        myfile.write(data)
                        print("saved")
                        data = sock.recv(40960000)
                        if not data:
                            myfile.close()
                            break
                        myfile.write(data)
                        myfile.close()
                        print("actually saved")
                        sock.sendall("GOT IMAGE".encode(encoding = 'UTF-16',errors = 'strict'))
                        sock.shutdown(socket.SHUT_RDWR)
            except Exception as inst:
 #               print('sock broke')
                print(inst)
                sock.close()
                connected_clients_sockets.remove(sock)
                continue
        imgcounter += 1
server_socket.close()

, а затем вот код клиента:

#!/usr/bin/env python

import random
import socket, select
from time import gmtime, strftime
from random import randint

image = "download-1.jpg"

HOST = 'my_ip'
PORT = 9999

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = (HOST, PORT)
sock.connect(server_address)

try:

    # open image
    myfile = open(image, 'rb')
    bytess = myfile.read()
    print(bytess)
    size = len(bytess)
    message = "SIZE " + str(size)
    # send image size to server
    #sock.sendall("SIZE %s",size)
    sock.sendto(message.encode(encoding = 'UTF-16',errors = 'strict'),(HOST, PORT))

    answer = sock.recv(4096).decode(encoding = 'UTF-16',errors = 'strict')
    print ('answer = ',answer)

    # send image to server
    if answer == 'GOT SIZE':
        sock.sendto(bytess,(HOST, PORT))
        #sock.sendall(bytess)

        # check what server send
        answer = sock.recv(4096)
        print ('answer = ',answer)

        if answer == 'GOT IMAGE' :
            #sock.sendall("BYE BYE ")
            sock.sendto("BYE BYE ".encode(encoding = 'UTF-16',errors = 'strict'),(HOST, PORT))
            print ('Image successfully send to server')

    myfile.close()

finally:
    sock.close()

У меня есть оба сценария на обоих устройствах, и я сначала использую сервер на rpi для передачи изображения туда, а затем запускаю сервер на локальном компьютере, чтобы передать его обратно. Есть идеи, почему это происходит?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...