Я экспериментировал с библиотекой сокетов для python. Я сделал простую программу для сервера и клиента, где клиент может отправлять сообщения серверу.
import socket
print("Host")
socket_main = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket_main.bind(('127.0.0.1', 9999))
socket_main.listen(1)
conn, addr = socket_main.accept()
while True:
data = conn.recv(1204).decode()
print(data)
conn.close()
import socket
print("Client")
socket_main = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket_main.connect(('127.0.0.1', 9999))
while True:
message = input(": ")
socket_main.send(message.encode())
socket_main.close()
Когда я запускаю эти программы в двух разных терминалах на одном компьютере, все работает нормально, но когда я пытаюсь запустить сервер и клиент на разных компьютерах, я получаю сообщение об ошибке на стороне клиента: «Не удалось установить соединение, потому что целевая машина активно отказывался от него».
Я пробовал несколько раз менять порт, но это не помогло. Я просмотрел много других форумов, и я не мог решить эту проблему некоторое время, поэтому я решил спросить здесь.
Я неправильно прочитал. Не видел, что они пытались подключить кросс-сети!
when I try to run the server and client on different computers I get an error on the clients end
Это потому, что вы используете127.0.0.1
с обеих сторон. Это IP-адрес замыкания на локальном хосте. Он работает, когда клиент и сервер находятся на одном компьютере, но не маршрутизируются в сети LAN.
Тебе нужно:
измените сервер для прослушивания либо 0.0.0.0
(для прослушивания всех установленных сетевых интерфейсов), либо его фактический IP-адрес в локальной сети (только сетевой интерфейс, подключенный к локальной сети).
изменить клиент для подключения к имени хоста или IP-адресу сервера в локальной сети.
I have tried changing the port multiple times but it didn't help
Проблема не с портом, а с IP-адресом.
Вы имеете в виду выполнение этого на сервере: socket_main.bind(('0.0.0.0', 9999)), а это на клиенте: socket_main.connect((socket.gethostname(), 9999))
@ sashasmol26 да для сервера, нет для клиента. socket.gethostname()
возвращает имя хоста локального компьютера, поэтому вызов этого на клиентском компьютере вернет имя хоста клиента, а не сервера. Но вы можете заставить сервер отображать результат gethostname()
, а затем ввести это значение в клиент.
Да, это работает, спасибо
@WardenUnleashed, который также не будет работать в сети