首页 > 解决方案 > 通过套接字发送文件时出现问题“在'int'和''字节'的实例之间不支持''

问题描述

大家下午好

我正在尝试使用 python3 中的套接字发送文件,但是在尝试发送以下文件时出现小错误:

在客户端:

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

在服务器端连接结束

尝试将大小的字节转换int (size)为整数,但它不起作用

我希望你能帮帮我

服务器.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()

客户端.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 byte order 。关于你答案的第二部分。我的理解是服务器期望一个长度,例如1个字节,这可能是要发送的文件大小长度的长度,例如:File = 1024bytes LongFile = 4 <- 这个数字被发送并且它是分机号码

然后服务器现在等待分机号码 4,例如 1024。这样,服务器接收到的信息就会受到限制。这是正确的?

标签: python-3.xsockets

解决方案


看起来您想通过套接字将文件的大小作为字节发送。要将 Python 整数转换为字节,请确定要发送的字节数并选择 little-endian 或 big-endian 字节顺序:

>>> 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 个字节,然后提取前四个字节作为大小。


推荐阅读