Python socket.error: Se rechazó la conexión

Estoy tratando de escribir un progtwig para la transferencia de archivos utilizando sockets. El extremo del servidor del código se está ejecutando bien. Sin embargo, en el lado del cliente me sale el siguiente error

Traceback (most recent call last): File "client.py", line 54, in  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 otras publicaciones en Stack Overflow, ninguna de ellas me ayudó. ¿Puede alguien ayudarme por favor? Los números de línea pueden ser diferentes ya que pegué solo una parte del código

El problema obviamente fue (como lo descubrió) que el puerto 36250 no estaba abierto en el lado del servidor en el momento en que intentó conectarse (por lo tanto, se rechazó la conexión). Puedo ver que el servidor tenía que abrir este socket después de recibir el comando SEND en otra conexión, pero aparentemente “no lo estaba abriendo en sincronización con el lado del cliente”.

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

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

simplemente colocaría los datos en un búfer de sistema operativo; close probable que close descargue los datos y se introduzca en la red, pero es casi seguro que volverá antes de que los datos lleguen al servidor. Agregar sleep después de close puede mitigar el problema, pero esto no es sincronización .

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

La otra cosa es que debe verificar los valores de retorno de send para asegurarse de cuántos bytes se tomaron de su búfer. O utilizar sendall .

(Perdón por molestar con esta respuesta tardía, pero encontré que esta era una pregunta de alto tráfico y realmente no me gustó la idea del sueño en la sección de comentarios).