Подключите несколько компьютеров с помощью сокетов (python) - PullRequest
0 голосов
/ 10 апреля 2020

Я пытаюсь подключить несколько компьютеров с помощью сокетов. Я могу запустить хост и клиент на моем компьютере, и они подключатся. Но если я попытаюсь запустить клиент на другом компьютере, он не подключится. Это мой хост-код:

import socket
import requests

# NOTES:socket.gethostname()

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('0.0.0.0', 1234))
s.listen(5)
print("Searching for available computers...")
while True:
                clientsocket, address = s.accept()
                print(f"Connection from {address} has been established!")
                usr = input("Temporary username for this session: ")
                msg = input("Send to client: ")
                clientsocket.send(bytes(usr + " says > " + msg, "utf-8"))
                break

while True:
        msg1 = input("Send to client: ")
        clientsocket.send(bytes(usr + " says > " +msg1, "utf-8"))
#w

, а это мой код для клиента:

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((socket.gethostname(), 1234))

while True:
    msg = s.recv(1028)
    print(msg.decode("utf-8"))

что не так?

Ответы [ 2 ]

0 голосов
/ 10 апреля 2020

Часть «0.0.0.0» верна (имейте в виду, что этот конфиг позволяет любому IP-адресу подключаться к серверу (из WAN и из LAN)). Вы должны изменить это:

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((socket.gethostname(), 1234))

while True:
    msg = s.recv(1028)
    print(msg.decode("utf-8"))

на это:

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("ip of the server", 1234))

while True:
    msg = s.recv(1028)
    print(msg.decode("utf-8"))

Поскольку команда socket.gethostname() предназначена для получения IP-адреса машины, на которой вы запускаете программу ( не сам сервер ... в действительности, если не указан, клиент никак не может узнать, по какому адресу расположен сервер)

ps не забудьте открыть порт 1234 на компьютере сервера +, пожалуйста, не используйте 1028 ... это очень плохое число: используйте 1024 вместо

0 голосов
/ 10 апреля 2020

Это связано с тем, что IP-адрес, который прослушивает сервер, равен 0.0.0.0 (localhost), только программы на одном компьютере могут получить доступ к этому IP-адресу. Измените IP-адрес с сервера на socket.gethostbyname(socket.gethostname()), который вернет локальный IP-адрес вашего компьютера. И этот локальный IP-адрес может быть доступен любому, кто подключен к той же сети. В коде клиента вы должны изменить IP-адрес на IP-адрес, полученный из функции выше. Поэтому запустите print(socket.gethostbyname(socket.gethostname())) на компьютере сервера и установите IP-адрес, к которому подключается клиент, к напечатанному значению.

...