Почему я получаю сообщение об ошибке "соединение отказалось" в Python? (Розетки)
Я новичок в Sockets, пожалуйста, извините мое полное отсутствие понимания.
У меня есть сервер script (server.py):
#!/usr/bin/python
import socket #import the socket module
s = socket.socket() #Create a socket object
host = socket.gethostname() #Get the local machine name
port = 12397 # Reserve a port for your service
s.bind((host,port)) #Bind to the port
s.listen(5) #Wait for the client connection
while True:
c,addr = s.accept() #Establish a connection with the client
print "Got connection from", addr
c.send("Thank you for connecting!")
c.close()
и клиент script (client.py):
#!/usr/bin/python
import socket #import socket module
s = socket.socket() #create a socket object
host = '192.168.1.94' #Host i.p
port = 12397 #Reserve a port for your service
s.connect((host,port))
print s.recv(1024)
s.close
Я иду на свой рабочий стол и запускаю script, введя:
python server.py
после чего я иду на свой терминал для ноутбука и запускаю клиентский script:
python client.py
но я получаю следующую ошибку:
Файл "client.py", строка 9, в
s.connect((хост, порт))
Файл "/usr/lib/python2.7/socket.py", строка 224, в методе
return getattr (self._sock, name) (* args)
socket.error: [Errno 111] Соединение отклонено
Я пробовал использовать разные номера портов безрезультатно. Тем не менее, мне удалось получить имя хоста, используя тот же ip и метод gethostname() в клиенте script, и я могу выполнить ping на рабочем столе (сервере).
Ответы
Ответ 1
Вместо
host = socket.gethostname() #Get the local machine name
port = 12397 # Reserve a port for your service
s.bind((host,port)) #Bind to the port
попробуйте
port = 12397 # Reserve a port for your service
s.bind(('', port)) #Bind to the port
чтобы прослушивающий сокет не был слишком ограничен. Возможно, в противном случае прослушивание происходит только на одном интерфейсе, который, в свою очередь, не связан с локальной сетью.
Одним из примеров может быть то, что он слушает только 127.0.0.1
, что делает невозможным соединение с другим хостом.
Ответ 2
Эта ошибка означает, что по какой-либо причине клиент не может подключиться к порту на компьютере, на котором запущен сервер script. Это может быть вызвано несколькими вещами, такими как отсутствие маршрутизации в пункт назначения, но поскольку вы можете пинговать сервер, это не должно быть так. Другая причина может заключаться в том, что у вас есть межсетевой экран где-то между вашим клиентом и сервером - он может быть на самом сервере или на клиенте. Учитывая вашу сетевую адресацию, я предполагаю, что сервер и клиент находятся в одной локальной сети, поэтому не должно быть никакого маршрутизатора, который мог бы блокировать трафик. В этом случае я бы попробовал следующее:
- проверьте, действительно ли этот порт прослушивается на сервере (это должно сказать вам, делает ли ваш код то, что, по вашему мнению, он должен): на основе вашей ОС, но в Linux вы можете сделать что-то вроде
netstat -ntulp
- проверьте с сервера, если вы принимаете подключения к серверу: снова на основе вашей ОС, но
telnet LISTENING_IP LISTENING_PORT
должен выполнять работу
- проверьте, можете ли вы получить доступ к порту сервера от клиента, но не используя код: просто мы с telnet (или соответствующей командой для вашей ОС) с клиента
а затем дайте нам знать результаты.
Ответ 3
host = socket.gethostname() # Get the local machine name
port = 12397 # Reserve a port for your service
s.bind((host,port)) # Bind to the port
Я думаю, что эта ошибка может быть связана с разрешением DNS.
Это предложение host = socket.gethostname()
получает имя хоста, но если операционная система не может разрешить имя хоста локальному адресу, вы получите ошибку.
Операционная система Linux может изменить файл /etc/hosts
, добавить в нее одну строку. Он выглядит следующим образом ( "hostname" - это socket.gethostname()
).
127.0.0.1 hostname
Ответ 4
Предположим, что s = socket.socket()
Сервер может быть связан следующими способами:
Способ 1:
host = socket.gethostname()
s.bind((host, port))
Способ 2:
host = socket.gethostbyname("localhost") #Note the extra letters "by"
s.bind((host, port))
Способ 3:
host = socket.gethostbyname("192.168.1.48")
s.bind((host, port))
Если вы точно не используете тот же метод на стороне клиента, вы получите сообщение об ошибке: socket.error errno 111 connection refused.
Итак, вы должны использовать на стороне клиента точно такой же метод для получения хоста, как и на сервере. Например, в случае клиента вы также будете использовать следующие методы:
Способ 1:
host = socket.gethostname()
s.connect((host, port))
Способ 2:
host = socket.gethostbyname("localhost") # Get local machine name
s.connect((host, port))
Способ 3:
host = socket.gethostbyname("192.168.1.48") # Get local machine name
s.connect((host, port))
Надеюсь, что эта проблема решает.
Ответ 5
попробуйте эту команду в терминале:
sudo ufw enable
ufw allow 12397
Ответ 6
в файле server.py сделайте: host ='192.168.1.94'
вместо host = socket.gethostname()
Ответ 7
Я был в состоянии пропинговать свое соединение, но все еще получал ошибку "отказано в соединении". Оказывается, я пинговал себя! Вот в чем проблема.