2012-07-20 20 views
14

Sto provando a scrivere un programma per il trasferimento di file tramite socket. La fine del codice del server sta funzionando bene. Tuttavia, nel lato client ricevo il seguente errorePython socket.error: [Errno 111] Connessione rifiutata

Traceback (most recent call last): 
File "client.py", line 54, in <module> 
uploadFiles(directory) 
File "client.py", line 36, in uploadFiles 
transferFile(fname) 
File "client.py", line 13, in transferFile  
cs.connect((HOST, 36258)) 
File "/usr/lib/python2.7/socket.py", line 224, in meth 
return getattr(self._sock,name)(*args) 
socket.error: [Errno 111] Connection refused 

Il mio codice è il seguente

import os 
import socket 

def transferFile(fname): 
    HOST = '127.0.0.1' 
    CPORT = 36258 
    MPORT = 36250 
    FILE = fname 
    cs = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    cs.connect((HOST, 36258)) 
    cs.send("SEND " + FILE) 
    cs.close() 
    ms = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    ms.connect((HOST, MPORT)) 
    f = open(FILE, "rb") 
    data = f.read() 
    f.close() 
    ms.send(data) 
    ms.close() 

def uploadFiles(directory): 
    home = os.getenv("HOME") 
    folder = str(home + "/" + directory) 
    os.chdir(folder) 
    dirList = os.listdir(folder) 
    print dirList 
    for fname in dirList: 
     if fname.endswith('.bin'): 
      transferFile(fname) 

os.chdir(os.getenv("HOME")) 
directory = "testdownload" 
if not os.path.exists(directory): 
    os.makedirs(directory) 
os.chdir(directory) 

uploadFiles(directory) 

Ho provato a cercare aiuto su Google e altri messaggi su Stack Overflow, nessuno di loro ha aiutato. Qualcuno può aiutarmi? I numeri di riga possono essere diversi poiché ho incollato solo una parte del codice

+0

Come fai a sapere che la fine del server sta lavorando? Il messaggio di errore suggerisce che la connessione TCP a 127.0.0.1:36258 viene rifiutata. Cosa succede quando si esegue 'telnet 127.0.0.1 36258'? –

+0

Ho eseguito 'telnet 127.0.0.1 36258' e sono riuscito a vedere la connessione. 'Connesso a 127.0.0.1' ' Il carattere di escape è '^]'. ' Ho controllato il server e ho scoperto che c'era un problema con i socket che non si aprivano in sincronia con il lato client Grazie – hld619

+0

Per aggiungere al commento precedente, ho aggiunto un ritardo di 2 secondi dopo 'cs.close()' e dopo 'ms.close()' in modo da sincronizzarsi con le connessioni sul server fine e ha funzionato come un fascino. Grazie tc – hld619

risposta

13

Il problema ovviamente era (come avete capito) che la porta 36250 non era aperta sul lato server al momento in cui si tentava di connettersi (quindi connessione rifiutata). Posso vedere che il server avrebbe dovuto aprire questo socket dopo aver ricevuto il comando SEND su un'altra connessione, ma apparentemente era "non l'apertura [it] in sincronia con il lato client".

Bene, il motivo principale sarebbe che non c'era alcuna sincronizzazione. Chiamata:

cs.send("SEND " + FILE) 
cs.close() 

posiziona i dati in un buffer OS; close probabilmente scaricherò i dati e inserirli nella rete, ma quasi sicuramente tornerebbe prima che i dati raggiungessero il server. L'aggiunta di sleep dopo il close potrebbe mitigare il problema, ma non è la sincronizzazione.

La soluzione corretta sarebbe assicurarsi che il server abbia aperto la connessione. Ciò richiederebbe che il server inviasse un messaggio indietro (ad esempio OK, o meglio PORT 36250 per indicare dove connettersi). Ciò assicurerebbe che il server stia già ascoltando.

L'altra cosa è è necessario verificare i valori restituiti di send per assicurarsi di quanti byte sono stati prelevati dal proprio buffer. O utilizzare sendall.

(Ci scusiamo per il disturbo con questa risposta in ritardo, ma ho trovato questo per essere una domanda di traffico elevato e davvero non mi piaceva l'idea di sonno nella sezione commenti.)

+0

E 'stato molto tempo fa, ma usare il sonno mi sembra sciocco ora; comunque, grazie mille per la risposta! :) – hld619

Problemi correlati