2012-07-20 25 views
14

Estoy tratando de escribir un programa para la transferencia de archivos utilizando sockets. El servidor al final del código está funcionando bien. Sin embargo, en el lado del cliente me sale el siguiente errorPython socket.error: [Errno 111] Conexión rechazada

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 

Mi código es el siguiente

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) 

Intenté buscar ayuda en Google y otros cargos en desbordamiento de pila, ninguno de ellos ayudó. ¿Puede alguien ayudarme? Los números de línea pueden ser diferentes ya que pegué solo una parte del código

+0

¿Cómo sabe que el extremo del servidor ¿está trabajando? El mensaje de error sugiere que se rechaza la conexión TCP a 127.0.0.1:36258. ¿Qué sucede cuando ejecuta 'telnet 127.0.0.1 36258'? –

+0

Corrí 'telnet 127.0.0.1 36258' y pude ver la conexión. 'Probar 127.0.0.1 ...' 'Conectado a 127.0.0.1' ' El carácter de escape es '^]'. ' Revisé el extremo del servidor y encontré que había un problema con los enchufes que no se abrían en sincronía con el lado del cliente Gracias – hld619

+0

Para agregar al comentario anterior, agregué un retraso de 2 segundos después de 'cs.close()' y después de 'ms.close()' para sincronizar con las conexiones en el servidor final y funcionó como un encanto. Gracias tc – hld619

Respuesta

13

El problema obviamente era (como lo descubrió) que el puerto 36250 no estaba abierto en el servidor cuando intentó conectarse (por lo que la conexión se negó). Puedo ver que se suponía que el servidor abría este socket después de recibir el comando SEND en otra conexión, pero al parecer "no estaba [abriéndolo] sincronizado con el lado del cliente".

Bueno, la razón principal sería que no hubo sincronización alguna. Llamar a:

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

simplemente colocaría los datos en un búfer del sistema operativo; close probablemente vaciará los datos y empujará a la red, pero casi con certeza volverá antes de que los datos lleguen al servidor. Agregar sleep después de close podría mitigar el problema, pero esto no es la sincronización.

La solución correcta sería asegúrese de que el servidor haya abierto la conexión. Esto requeriría que el servidor le envíe algún mensaje de vuelta (por ejemplo, OK, o mejor PORT 36250 para indicar dónde se conecta). Esto aseguraría que el servidor ya esté escuchando.

La otra cosa es debe comprobar los valores de devolución de send para asegurarse de cuántos bytes se tomaron de su búfer. O use sendall.

(Lo siento por molestar con esta respuesta tardía, pero me pareció que para ser una cuestión de alto tráfico y realmente no me gusta la idea del sueño en la sección de comentarios.)

+0

Hacía mucho tiempo, pero el sueño me suena tonto ahora; de todos modos, ¡muchas gracias por la respuesta! :) – hld619

Cuestiones relacionadas