Почему я получаю сообщение об ошибке "соединение отказалось" в 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

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