Сокет Python.ошибка: [Errno 111] соединение отказано

Я пытаюсь написать программу для передачи файлов через сокеты. Серверная часть кода работает нормально. Однако, на стороне клиента, я получаю следующую ошибку

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

мой код выглядит следующим образом

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)

Я попытался найти помощь в Google и других сообщениях о переполнении стека, ни один из них не помог. Кто-нибудь может мне помочь? Номера строк могут отличаться, так как я вставил только часть кода

1 ответов


проблема, очевидно, была (как вы поняли), что порт 36250 не был открыт на стороне сервера в то время, когда вы пытались подключиться (следовательно, соединение отказано). Я вижу, что сервер должен был открыть этот сокет после получения SEND команда на другом соединении, но, по-видимому,"не открывалась [она] синхронно с клиентской стороной".

ну, основной причиной было бы отсутствие синхронизации вообще. Зову:

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

просто место данные в буфер ОС;close вероятно, сбросит данные и толкнет в сеть, но он почти наверняка вернется до того, как данные достигнут сервера. Добавление sleep после close может смягчить проблему, но это не синхронизация.

правильным решением было бы убедится сервер открыл соединение. Для этого потребуется сервер, отправляющий вам сообщение (например,OK или лучше PORT 36250 в укажите место подключения). Это позволит убедиться, что сервер уже слушать.

другое дело вы должны проверить возвращаемые значения send чтобы убедиться, сколько байтов было взято из вашего буфера. Или использовать sendall.

(извините за беспокойство с этим поздним ответом, но я нашел, что это высокий вопрос трафика, и мне действительно не понравилась идея сна в разделе комментариев.)