2012-02-21 13 views
15

Sto provando a creare un programma in Python che implementa i socket, ogni client invia un file PDF e il server lo riceve e il titolo viene modificato in "file_number.pdf" (es .: file_1 .PDF). Il problema presentato è che solo un client può inviare un file con successo. Quando un secondo client tenta di inviare il programma si blocca. Cosa sto facendo male e come posso risolvere il mio codice per consentire ai client N (con N < 20) di connettersi al server e trasferire i file?Invia un file attraverso i socket in Python

Ecco il codice del server:

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

Ecco il codice del client:

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

Per semplificare il mio codice che uso sempre un libro con il nome del file "libroR.pdf", ma nel pieno il codice è scelto da un'interfaccia utente grafica.

+0

ci mostrano gli errori, e ci dica se è il cliente o il server che è influenzata. – Marcin

+0

@Marcin non mi insegna alcun errore, solo il primo client invia il file e termina con successo e il server continua ad attendere altre richieste, quando un secondo client tenta di connettersi, il programma client non fa nulla e rimane in standby. – franvergara66

risposta

12

È necessario inserire tutto il codice da sc, address = s.accept() fino a sc.close() in un altro ciclo o il server termina semplicemente dopo aver ricevuto il primo file. Non si blocca, lo script è appena finito.

[EDIT] ecco il codice rivisto:

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

Nota che s.listen(10) significa "set maximum accept rate to 10 connections", non "si ferma dopo 10 connessioni".

+0

un altro ciclo a parte il ciclo di lettura socket? Non ho un'idea chiara – franvergara66

+0

In realtà s.listen (10) significa "consentire fino a 10 connessioni TCP in ingresso non accettate() per essere accodate dallo stack TCP allo stesso tempo". Se 10 connessioni TCP in entrata sono già nella coda dello stack TCP per questo socket, eventuali altre saranno rifiutate (finché il programma non scarica la coda accettando() alcune delle connessioni in esso contenute) –

1

Si sta chiudendo il socket del server (s nel codice) dopo aver gestito la prima connessione client. Pertanto, solo un client viene gestito dal tuo server. Fai un giro intorno allo accept e leggendo dallo sc.

3

Il codice si blocca nel secondo ciclo while.

See:

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