#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
это две разные вещи