Как отправить изображение с сервера на клиент в python

Я новичок в python, и я не могу понять, что не так с моим кодом здесь:

Я настроил клиент и сервер (оба на локальном хосте), сервер делает снимок и предполагает отправить его клиенту, который сохраняет его в какой-то папке, все это происходит, но файл JPG не открывает изображение правильно, вместо этого он говорит, что он не поддерживает формат файла :\

код:

clientFile.py

import socket

# set up a socket connection object
my_socket = socket.socket()
# make the socket connect to a certain ip&port
my_socket.connect(("127.0.0.1", 8821))

data = ''

while data != 'EXIT':
    message = input('enter a message to send to the server \n')
    # send the server what to do (in this case take a snapshot)
    my_socket.send(message.encode())
    
    data = my_socket.recv(1024).decode()
   
    if data == 'snapshot has been taken':
        # recieve the file's byte length from the server ( for example: 2000000 bytes => 7 length)
        data = my_socket.recv(1).decode()
        
        sizeLength = int(data) % 10
        # recieve the size of the file picture
        data = my_socket.recv(sizeLength).decode()
        size = int(data)

        # recieve the file in binary
        picture = my_socket.recv(size)
        # trying to write the file :\
        myfile = open(r'C:\test\client\screen.jpg', 'wb')
        myfile.write(picture)
        myfile.close()
else:
    print('closing the socket')
    my_socket.close()

сервер.py

    import socket
    import datetime
    import glob
    import os
    import pyautogui
    import subprocess
    
    server_socket = socket.socket()
    # accepting a socket from which client (0.0.0.0) means everyone
    server_socket.bind(("0.0.0.0", 8821))
    server_socket.listen()
    # accept sockets and recieve socket and client ip&port as tuples
    (client_socket, client_address) = server_socket.accept()
    
    # data = client_socket.recv(1024).decode()
    data = ''
    while data != 'EXIT':
    .
    .
    .
        elif data == 'SNAPSHOT':
            #snapshot saved succesfully !
            image = pyautogui.screenshot()
            image.save(r'C:\test\screen.jpg') 

            # file stats (size and stuff)
            picStats = os.stat(r'C:\test\screen.jpg')
            
            picSize = picStats.st_size
            picLength = len(str(picSize))
          
            
            myfile = open(r'C:\test\screen.jpg', 'rb')
            print(myfile.read())
            reply = 'snapshot has been taken'
            # make the client prepere for the picture to be send
            client_socket.send(reply.encode())
            # send the picture length
             client_socket.send(str(picLength).encode())
            # send the picture size 
            client_socket.send(str(picSize).encode())
            client_socket.send(myfile.read())
            
.
.
.
#closing sockets eventually ...
             

я думаю, что я что-то упускаю здесь... Спасибо

Откройте файл в редакторе (который также поддерживает отображение информации в шестнадцатеричном формате) и посмотрите на различия до и после отправки файла. В частности, я предполагаю, что ваши вызовы recv содержат больше данных, чем вы ожидаете, или что вы неправильно используете информацию о размере (поскольку она отправляется в виде строки с одной стороны, а затем читается только как один байт (? ) на другой стороне)

MatsLindh 23.12.2020 17:21

Пожалуйста, отредактируйте свой код в своем вопросе, чтобы он был минимальным воспроизводимым примером - в частности, удалите эти ... разделы и сделайте его запускаемым минимальным примером. Любой должен иметь возможность копировать/вставлять ваш код в два файла и, не добавляя ничего, запускать его, чтобы увидеть тот же результат, что и вы. Ваш код не ограничен отправкой файла JPEG, вы должны иметь возможность отправлять файл с ascii content - первое, что я бы сделал, это проверил, что принимающая сторона получает правильный размер файла. Также вы должны позволить принимающей стороне получать меньше байтов, чем полная длина, и сохранить их в файл, а затем дождаться остальных.

DisappointedByUnaccountableMod 23.12.2020 18:35

Вы смотрели на многопроцессорный модуль? Там решают эти вопросы.

Glenn Gribble 23.12.2020 19:22
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
821
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ну, у меня есть одна проблема с кодом:

# This reads all the bytes in the file 
print(myfile.read())

# this will read nothing since the file cursor is already at the end of the file. 
client_socket.send(myfile.read())

Либо установите байты во внутренний объект file_bytes= myfile.read(), либо сбросьте курсор между чтениями myfile.seek(0)

ВЫ ЧЕЛОВЕК-ЛЕГЕНДА! Спасибо! Такая глупая ошибка

Arik Jordan Graham 23.12.2020 19:18

Другие вопросы по теме