Ошибка таймаута серверного / клиентского приложения в локальной сети

#python #sockets #networking #lan

#python #сокеты #сеть #локальная сеть

Вопрос:

У меня есть две программы: server.py и client.py . Мне нужно иметь возможность использовать server.py на моем основном компьютере, и client.py с моего ноутбука. Когда я их запускаю, я получаю следующую ошибку от client.py:

 TimeoutError: [WinError 10060]
  

Я отключил брандмауэры как на моем компьютере (под управлением Windows 7), так и на моем ноутбуке (под управлением Windows 8).

Как мне заставить их подключиться?

Некоторые вещи, которые я пробовал:

  • Создание правил портов брандмауэра на компьютере.
  • Отключение брандмауэра на обоих компьютерах.
  • Использование разных портов.
  • Изменяя адрес сервера с «localhost» на socket.gethostname(), это изменяет ошибку с TimeoutError на ConnectionRefusedError .

IP-адрес моего компьютера — 192.168.0.2, и я уверен в этом, потому что у меня есть сервер Apache, работающий на порту 80, и он работает (я могу получить к нему доступ со своего ноутбука).

Версии Python: ПК: 3.5.2, ноутбук: 3.4.1

Код

server.py:

 import socket
import threading

server_port = 2569
server_address = "localhost"

class ClientThread(threading.Thread):
    def __init__(self, client_info):
        super(ClientThread, self).__init__()
        self.client_info = client_info

    def run(self):
        socket = self.client_info[0]
        bytes_received = socket.recv(100)
        print(bytes_received.decode("utf-8"))

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind((server_address, server_port))
server_socket.listen(5)

while True:
    new_client = server_socket.accept()
    ClientThread(new_client).run()
  

client.py:

 import socket

server_port = 2569
server_address = "192.168.0.2"

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.connect((server_address, server_port))
server_socket.send(b"message")
  

Ответ №1:

Вам просто нужно изменить localhost или socket.gethostname() в server.py/client.py сценариях на фактический внутренний IP-адрес сервера. Тогда это сработает!

Если вы хотите узнать больше, почему это происходит, я рекомендую прочитать этот пост, в котором подробно объясняются различия между localhost/127.0.0.1 и internal ip машиной, которые ошибочно считаются одним и тем же, но на самом деле это не так.

Комментарии:

1. Тогда как мне найти внутренний IP-адрес?

2. @sempiedram какую ОС вы используете? На самом деле, если вы используете свой компьютер в качестве сервера, в своем посте вы упомянули, что у него есть внутренний IP 192.168.0.2 -адрес — это внутренний ip….

3. @sempiedram Я опробовал ваши скрипты, и они успешно выполнились после изменения с localhost моего внутреннего IP-адреса. У localhost меня тоже была такая же ошибка…

4. Большое вам спасибо. Да, я был уверен, что уже пытался использовать 192.168.0.2 для сервера, но это выдало мне ошибку или что-то в этом роде. Но сейчас это работает! Спасибо.

5. @sempiedram, это был отличный вопрос, потому что он практически доказывает — показывает, что localhost и internal ip это две разные вещи