python-3.x - 通过套接字发送文件时出现问题“在'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 整数转换为字节,请确定要发送的字节数并选择 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 个字节,然后提取前四个字节作为大小。
推荐阅读
- javascript - 如何根据值使猫鼬模式动态化?
- python - 为什么 QTableView 有空白边距,我该如何删除它们?
- php - Wordpress 自定义小部件显示在错误的位置
- python - 使用机器人阅读 Discord 频道消息
- python - 访问列表元素的while循环问题
- reactjs - 如何获取输入字段的值并在 React 的 URL 中使用它
- arrays - 将 JSON 对象转换为新数组
- jupyter-notebook - add() 缺少 1 个必需的位置参数:'sum1'
- javascript - 基于多级键在对象中查找值?
- javascript - Redux reducer 状态突变和恢复初始状态