Проблема при отправке файла через сокеты "не поддерживается между экземплярами 'int' и '' bytes '' - PullRequest
0 голосов
/ 21 июня 2019

Добрый день всем

Я пытаюсь отправить файл с использованием сокетов в python3, однако при попытке отправить файл получаю небольшую ошибку:

на стороне клиента:

Line 18
while current_size < size
TypeError '<' not supported between instances of 'int' and 'bytes'

В то время как на стороне сервера соединение заканчивается

Попробуйте преобразовать байты размером int (size) в целые числа, но это не сработало

Надеюсь, выможете мне помочь

server.py

import socket
import os

servidor = socket.socket()
conexion = (socket.gethostname(),900)
servidor.bind(conexion)
servidor.listen(1)

cliente,direccion = servidor.accept()

longitud = os.path.getsize("imagen.jpg")

while True:
    datos = cliente.recv(1024).decode()
    mensaje = input("> ")
    cliente.sendall(mensaje.encode())
    if datos == "exit":
        cliente.sendall("exit".encode())
        break
    elif datos == "archivo":
        cliente.send(bytes(longitud))
        with open("imagen.jpg","rb") as file:
            d = file.read(1024)
            while d:
                cliente.send(d)
                d = file.read(1024)
servidor.close()

client.py

import socket

conexion = ("Pc-1",900)
cliente = socket.socket()
cliente.connect(conexion)

while True:
    msg = input("> ")
    cliente.sendall(msg.encode())
    respuesta = cliente.recv(1024)
    print(respuesta.decode())

    if msg == "archivo":
        size = cliente.recv(1024)
        size = bytes(size)
        current_size = 0
        bufer = b""
        while current_size < size:
            data = cliente.recv(1024)
            if not data:
                break
            if len(data) + current_size<size:
                data = data[:size-current_size]
            bufer += data
            current_size += len(data)
        with open("recibido.jpg","wb") as file:
            file.write(bufer)

ОБНОВЛЕНИЕ

@ MarkTolonen, Выможет быть немного более явным с порядком байтов little-endian и big-endian.По поводу второй части вашего ответа.Я понял, что сервер ожидает длину, например, 1 байт, которая может быть длиной отправляемого файла, например: File = 1024bytes LongFile = 4 <- это число отправлено, и онос добавочным номером </p>

Затем сервер теперь ждет добавочный номер 4, например, 1024.Таким образом, информация, полученная сервером, будет ограничена.Это правильно?

1 Ответ

1 голос
/ 21 июня 2019

Похоже, вы хотите отправить размер файла в байтах через сокет.Чтобы преобразовать целое число Python в байты, определите, сколько байтов вы хотите отправить, и выберите порядок байтов с прямым порядком байтов или байтов с прямым порядком байтов:

>>> size = 100000
>>> size.to_bytes(4,'big')
b'\x00\x01\x86\xa0'
>>> int.from_bytes(b'\x00\x01\x86\xa0','big')
100000

Еще одна проблема, с которой вы столкнетесь, заключается в том, что поток сокетовне имеет границ сообщения.Ваш cliente.recv(1024) может получить 0 (соединение закрыто) или от 1 до 1024 байтов.Первые четыре будут размером, а остальные будут началом файла.Вы должны буферизовать прием до тех пор, пока у вас не будет как минимум 4 байта, а затем извлечь первые четыре байта как размер.

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