refused - Python socket.error:[Errno 111] Se rechazó la conexión
return getattr self_sock name)(* args (1)
Estoy tratando de escribir un programa 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 <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 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 me pareció una pregunta de alto tráfico y realmente no me gustó la idea de dormir en la sección de comentarios).