Python Basic клиент-серверные сокет-программы - PullRequest
0 голосов
/ 06 октября 2019

Я попробовал базовые программы для клиента и сервера из realpython (https://realpython.com/python-sockets/#echo-client-and-server)

. Хотя они отлично работают при работе на одном компьютере, при попытке на разных машинах возникают следующие проблемы:

ConnectionRefusedError: [WinError 10061] Невозможно установить соединение, поскольку целевая машина активно отказала ему

Код клиента:


HOST = '10.0.0.55'   # The server's hostname or IP address
PORT = 65432        # The port used by the server

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((HOST, PORT))
    s.sendall(b'Hello, world')
    data = s.recv(1024)

print('Received', repr(data)) 

Код сервера:

import socket

HOST = '127.0.0.1'  # Standard loopback interface address (localhost)
PORT = 65432        # Port to listen on (non-privileged ports are > 1023)

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen()
    conn, addr = s.accept()
    with conn:
        print('Connected by', addr)
        while True:
            data = conn.recv(1024)
            if not data:
                break
            conn.sendall(data)

  • Я могу выполнять эхо-запросы с одного компьютера на другой.
  • Брандмауэр выключен
  • Wireshark показывает, чтосообщение SYN поступает на второй компьютер, на который приходит сообщение RST ( сервер ПК Wireshark )

1 Ответ

0 голосов
/ 06 октября 2019

Если вы хотите, чтобы сервер был открыт для других компьютеров, вы не можете прослушивать 127.0.0.1, который по сути является внутренним локальным циклом, расположенным только на компьютере, на котором запущена программа (поэтому в комментариях он называется loopback). Сервер должен прослушивать собственный реальный адрес (например: 10.0.0.55 явно).

Однако это может раздражать, если ваш хост может менять адреса, простой способ - просто использовать локальный IP-адрескак это (на сервере):

HOST = socket.gethostbyname(socket.gethostname())

Или, если вы специально хотите использовать адрес из одного сетевого интерфейса:

HOST = '10.0.0.55'

Или, если вы хотите слушать по всей сетиинтерфейсы:

HOST = '0.0.0.0'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...