Сокет 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
.
(извините за беспокойство с этим поздним ответом, но я нашел, что это высокий вопрос трафика, и мне действительно не понравилась идея сна в разделе комментариев.)