2012-02-21 111 views
15

Estoy tratando de hacer un programa en Python que implemente conectores, 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 que se presenta es que solo un cliente puede enviar un archivo con éxito. Cuando un segundo cliente intenta enviar el programa se bloquea. ¿Qué estoy haciendo mal y cómo puedo resolver mi código para permitir que N clientes (con N < 20) se conecten al servidor y transfieran archivos?Enviar un archivo a través de sockets en Python

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 de 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 el código siempre uso un libro con el nombre de archivo "libroR.pdf", pero en el pleno el código es elegido por una interfaz gráfica de usuario.

+0

nos muestran los errores, y nos dicen si es el cliente o el servidor que se ve afectado. – Marcin

+0

@Marcin no me enseña ningún error, solo el primer cliente envía el archivo y finaliza con éxito y el servidor continúa esperando más solicitudes, cuando un segundo cliente intenta conectarse, el programa cliente simplemente no hace nada y permanece en modo de espera. – franvergara66

Respuesta

12

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 cuelga, el script acaba de terminar.

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

import socket 
import sys 
s = socket.socket() 
s.bind(("localhost",9999)) 
s.listen(10) # Acepta hasta 10 conexiones entrantes. 

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):  
    # 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() 

Tenga en cuenta que s.listen(10) significa "set maximum accept rate to 10 connections", no "se detiene después de 10 conexiones".

+0

otro bucle aparte del bucle de lectura de zócalo? No tengo una idea clara – franvergara66

+0

En realidad, "escuchar" (10) significa "permitir que hasta 10 conexiones TCP entrantes no aceptadas() sean puestas en cola por la pila TCP al mismo tiempo". Si 10 conexiones TCP entrantes ya están en la cola de la pila TCP para este socket, las adicionales serán rechazadas (hasta que el programa agote la cola aceptando() algunas de las conexiones en ella) –

1

Está cerrando el socket del servidor (s en su código) después de manejar la primera conexión del cliente. Por lo tanto, solo un cliente es manejado por su servidor. Haga un círculo alrededor de accept y lea desde sc.

3

Su código se queda atascado en el segundo ciclo 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() 
Cuestiones relacionadas