Python3 не может получить изображение правильно - PullRequest
0 голосов
/ 06 ноября 2018

У меня проблема с сокетами python3. Я сделал функцию, которая получает список байтов, а затем создает изображение с байтами, которые находятся в списке. У меня есть конкретная задача зашифровать байты с использованием алгоритма симметричного ключа, но проблема в другом. После того, как я получил все данные, если я поместил break в клиент и в цикл сервера, изображение будет получено без проблем. Но если я хочу отправить еще одно сообщение на сервер, после отправки ему изображения, проблема возникает. Кажется, функция перестает получать. Я заметил, что после отправки байтов изображения на другую сторону, если цикл не останавливается, функция, которая должна получить изображение, не может получить ни одного байта. Так он блокируется в первом self.connection.recv(4096) и ничего не получает. Имейте в виду, что я новичок, это просто случайное задание. Да, сервер и клиент инвертированы, поэтому сервер запрашивает у клиента информацию (клиент должен отправить изображение на сервер).

server.py

def send_file(self, file_path):
    if os.path.exists(file_path):
        bytes = []
        with open(file_path, 'rb') as f:
            while True:
                data = base64.b64encode(f.read(1024))
                ciphertext = self.encryption.encrypt(data.decode("utf-8"))
                bytes.append(ciphertext)
                if not data:
                   break
            f.close()
        data = pickle.dumps(bytes)
        self.socket.send(data)
        print("sent")

client.py

def download_file(self, file_name, file_extension):
    bytes_received = []
    while True:
        data = self.connection.recv(4096)
        if not data:
            break
        bytes_received.append(data)
        print(bytes_received)
    try:
        data_arr = pickle.loads(b"".join(bytes_received))
    except EOFError:
        print("[-] the file does not exists")
        return
    print(data_arr)
    with open(file_path + file_name + "." + file_extension, 'wb') as f:
        for byte in data_arr:
            decrypted_bytes = base64.b64decode(self.encryption.decrypt(byte))
            f.write(decrypted_byte)
        f.close()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...