Q:

Error al intentar convertir cadena binaria a entero: ValueError: invalid literal for int()

Tengo el siguiente servidor que estoy tratando de realizar el problema surge que cuando el cliente pide al servidor el archivo y el servidor le responde. En el cliente sale el siguiente error:

Traceback (most recent call last):
  File "C:\Users\Angel\Desktop\cliente2.py", line 19, in <module>
    while current_size < int(size):
ValueError: invalid literal for int() with base 10:

Según entiendo el problema parece ser que no puede convertir size a entero
pero si lo dejo como bytes que es como viene me marca otro error y el cual es que no se pueden hacer operaciones entre bytes y enteros.
Les dejo los códigos, espero puedan ayudarme:
CLIENTE
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)
        print(size)

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

SERVIDOR
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()

Para poner un poco mas en contexto:
El cliente manda el mensaje archivo al servidor y el servidor si lee el mensaje archivo manda la longitud total del fichero a enviar a el cliente y posteriormente manda el archivo en blockes de 1024bytes.
Pero el cliente se queda sin hacer nada hasta que el servidor manda un mensaje entonces arroja el error de arriba.

A:

El problema es que bytes(int) no hace lo que esperas. Lo que hace este código es obtener un objeto bytes de la longitud determinada por el entero y lleno de bytes nulos:

>>> bytes(5)
b'\x00\x00\x00\x00\x00'

Lo más simple que puedes hacer es usar una cadena para representar el entero y después codificarla:

>>> longitud = 4
>>> long_repr = str(longitud).encode("utf-8")
>>> long_repr
b'4'
>>> int(long_repr)
4

Ten en cuenta que esto nada tiene que ver con obtener la representación binaria de un entero, lo cual también te serviría para tu caso. Para obtener la representación binaria de un entero tienes varias formas:

Usar el módulo struct:
>>> import struct
>>> longitud = 4

>>> int_repr = struct.pack(">Q", longitud)
>>> int_repr
b'\x00\x00\x00\x00\x00\x00\x00\x04'
>>> struct.unpack(">Q", int_repr)[0])
4

Al usar Q, el tamaño estándar es de 8 bytes, tipo unsigned long long en C. Esto nos permitiría almacenar como máximo el entero 18446744073709551615 (b'\xff\xff\xff\xff\xff\xff\xff\xff').
> indica que se use big-endian.
Usar int.to_bytes y int.from_bytes:
>>> longitud = 4
>>> int_repr = longitud.to_bytes(8, byteorder="big", signed=False)
>>> int_repr
b'\x00\x00\x00\x00\x00\x00\x00\x04'
>>> int.from_bytes(int_repr, byteorder="big", signed=False)
4

En este caso, para ser congruentes con el ejemplo anterior se ha usado también 8 bytes y big-endian

