Enviar un archivo a través de sockets en Python

Estoy tratando de hacer un progtwig en Python que implemente sockets, cada cliente envía un archivo PDF y el servidor lo recibe y el título se cambia a “file_number.pdf” (es decir: file_1.pdf). El problema presentado es que solo un cliente puede enviar un archivo correctamente. Cuando un segundo cliente intenta enviar el progtwig se bloquea. ¿Qué hago mal y cómo puedo resolver mi código para permitir que N clientes (con N <20) se conecten al servidor y transfieran archivos?

Aquí está el código del servidor:

import socket import sys s = socket.socket() s.bind(("localhost",9999)) s.listen(10) # Acepta hasta 10 conexiones entrantes. sc, address = s.accept() print address i=1 f = open('file_'+ str(i)+".pdf",'wb') # Open in binary i=i+1 while (True): # Recibimos y escribimos en el fichero l = sc.recv(1024) while (l): f.write(l) l = sc.recv(1024) f.close() sc.close() s.close() 

Aquí está el código del cliente:

 import socket import sys s = socket.socket() s.connect(("localhost",9999)) f = open ("libroR.pdf", "rb") l = f.read(1024) while (l): s.send(l) l = f.read(1024) s.close() 

Para simplificar mi código, siempre uso un libro con el nombre de archivo “libroR.pdf”, pero en el código completo se elige mediante una interfaz gráfica de usuario.

Debe poner todo el código de sc, address = s.accept() hasta sc.close() en otro bucle o el servidor simplemente termina después de recibir el primer archivo. No se bloquea, el script acaba de terminar.

[EDITAR] Aquí está el código revisado:

 import socket import sys s = socket.socket() s.bind(("localhost",9999)) s.listen(10) # Accepts up to 10 connections. while True: sc, address = s.accept() print address i=1 f = open('file_'+ str(i)+".pdf",'wb') #open in binary i=i+1 while (True): # receive data and write it to file l = sc.recv(1024) while (l): f.write(l) l = sc.recv(1024) f.close() sc.close() s.close() 

Tenga en cuenta que s.listen(10) significa ” establecer la velocidad de aceptación máxima en 10 conexiones “, no “parar después de 10 conexiones”.

Su código se está atascando en el segundo bucle while.

Ver:

 import socket import sys s = socket.socket() s.bind(("localhost",9999)) s.listen(10) i=1 while True: sc, address = s.accept() print address f = open('file_'+str(i)+".pdf",'wb') #open in binary i=i+1 print(i) l = 1 while(l): l = sc.recv(1024) while (l): f.write(l) l = sc.recv(1024) f.close() sc.close() s.close() 

Está cerrando los sockets del servidor ( s en su código) después de manejar la primera conexión de cliente. Por lo tanto, solo un cliente es manejado por su servidor. Hacer un bucle alrededor de accept y leer el sc .

Usando este código puedes enviar archivos varias veces usando el mismo client.py

Servidor.py

 import socket import sys s = socket.socket() s.bind(("localhost",9999)) s.listen(10) # Acepta hasta 10 conexiones entrantes. i = 1 while True: sc, address = s.accept() print address f = open('file_'+ str(i)+".wav",'wb') #open in binary i=i+1 while (True): # recibimos y escribimos en el fichero l = sc.recv(1024) f.write(l) if not l: break f.close() sc.close() print('copied the file.') s.close()