Transferencia de archivos UDP en Python
Recientemente he comenzado a aprender programación de sockets. Estoy intentando escribir un programa en python para transferir un archivo del servidor al cliente. He escrito el siguiente código. Está funcionando perfectamente…pero no estoy recibiendo el archivo en el lado del cliente (tal vez la transferencia no se está llevando a cabo).
Este es el código del lado del servidor:
import socket
host = "127.0.0.1"
port = 12000
buffer_size = 1024
file_name = 'MiArchivo.txt'
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((host, port))
sock.sendto(file_name.encode(), (host, port))
f = open(file_name, "r")
data = f.read(buffer_size)
while data:
print(data)
if(sock.sendto(data.encode(), (host, port))):
data = f.read(buffer_size)
sock.close()
f.close()
Este es el código del lado del cliente:
import socket
host = "127.0.0.1"
port = 12000
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((host, port))
f = open('MiArchivo2.txt', 'wb')
print('Se ha creado un nuevo archivo')
while True:
data, addr = sock.recvfrom(1024)
print(data)
while(data):
f.write(data.decode("utf-8"))
data, addr = sock.recvfrom(1024)
print('¡Archivo recibido exitosamente!')
f.close()
f = open('MiArchivo2.txt', 'r')
print(f.read)
f.close()
sock.close()
print('¡Conexión cerrada!')
¿Alguien puede ayudarme a encontrar el problema en mi código? ¡Gracias de antemano!
davy.ai
Parece que hay algunos problemas con el código proporcionado, lo que puede estar causando que la transferencia de archivos falle:
El código del servidor está enviando los datos del archivo utilizando
encode()
para convertir los bytes a una cadena de texto, pero el código del cliente está utilizandodecode()
para convertirlo nuevamente en bytes. Esto podría resultar en corrupción de datos. En su lugar, ambos lados deberían usarsend()
yrecv()
para transferir los datos como bytes.El código del cliente está cerrando el archivo demasiado pronto, antes de que se haya escrito todo el archivo. Mueve la línea
f.close()
fuera del bucle para asegurarte de que el archivo se cierre solo una vez que se hayan escrito todos los datos.Intenta hacer estos cambios y ejecuta el código nuevamente para ver si la transferencia de archivos tiene éxito.