Я новичок в 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 ...
я думаю, что я что-то упускаю здесь... Спасибо
Пожалуйста, отредактируйте свой код в своем вопросе, чтобы он был минимальным воспроизводимым примером - в частности, удалите эти ... разделы и сделайте его запускаемым минимальным примером. Любой должен иметь возможность копировать/вставлять ваш код в два файла и, не добавляя ничего, запускать его, чтобы увидеть тот же результат, что и вы. Ваш код не ограничен отправкой файла JPEG, вы должны иметь возможность отправлять файл с ascii content - первое, что я бы сделал, это проверил, что принимающая сторона получает правильный размер файла. Также вы должны позволить принимающей стороне получать меньше байтов, чем полная длина, и сохранить их в файл, а затем дождаться остальных.
Вы смотрели на многопроцессорный модуль? Там решают эти вопросы.
Ну, у меня есть одна проблема с кодом:
# 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)
ВЫ ЧЕЛОВЕК-ЛЕГЕНДА! Спасибо! Такая глупая ошибка
Откройте файл в редакторе (который также поддерживает отображение информации в шестнадцатеричном формате) и посмотрите на различия до и после отправки файла. В частности, я предполагаю, что ваши вызовы
recv
содержат больше данных, чем вы ожидаете, или что вы неправильно используете информацию о размере (поскольку она отправляется в виде строки с одной стороны, а затем читается только как один байт (? ) на другой стороне)