Я пытаюсь реализовать простую программу чата, которая использует сокеты для передачи данных через соединение UDP.Однако я не могу понять, как правильно настроить его так, чтобы люди из-за пределов моей локальной сети могли получить к нему доступ, если я размещаю его на своем ноутбуке.Я использую порт 5000 и перенес этот порт на моем маршрутизаторе для моего ноутбука.Переадресация портов, похоже, не является проблемой;По крайней мере, «Утилиты сетевой переадресации портов» от portforward.com, похоже, обнаруживают, что они правильно перенаправлены.Может быть, я смешиваю IP-адреса, с которых мне нужно хоститься и с которыми соединяться?Ниже приведен код:
import socket
import threading
import sys
class Server:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
connections = []
def __init__(self):
self.sock.bind(('192.168.1.5', 5000))
self.sock.listen(1)
def handler(self, c, a):
while True:
data = c.recv(1024)
for connection in self.connections:
print(data.decode())
connection.send(data)
if not data:
break
def run(self):
while True:
c, a = self.sock.accept()
cThread = threading.Thread(target=self.handler, args=(c, a))
cThread.daemon = True
cThread.start()
self.connections.append(c)
print(self.connections)
class Client:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
usr_name = ""
def sendMsg(self):
while True:
self.sock.send(bytes(self.usr_name + ": " + input("-> "), 'utf-8'))
def __init__(self, address):
self.sock.connect((address, 5000))
self.usr_name = input("Enter a username: ")
iThread = threading.Thread(target=self.sendMsg)
iThread.daemon = True
iThread.start()
while True:
data = self.sock.recv(1024)
if not data:
break
print(data.decode())
if len(sys.argv) > 1:
client = Client(sys.argv[1])
else:
server = Server()
server.run()
Как видите, мой текущий локальный IP-адрес введен для размещения сервера, а клиент запрашивает IP-адрес для подключения.Я не уверен, что теперь делать для размещения этого через Интернет, но я попробовал каждую комбинацию IP, которую я могу придумать, и она возвращает много ошибок.
Заранее спасибо.
Редактировать: две основные ошибки, которые я получаю:
- Ошибка тайм-аута [WinError 10060]
- Мой другполучил это при попытке подключения из другой сети
- [WinError 10061]
- Я получил бы это при попытке подключения с использованием моего публичного IP с того же компьютера
Извините, что не могу более подробно описать свои ошибки и предоставить полную распечатку, и я постараюсь обновить это, если смогу их воспроизвести.
Редактировать: Я смог переписать его и заставить его работать, мне больше не нужна помощь с этим.Спасибо.