Как починить сокеты питон??? Python
Server.py
import socket
from threading import Thread
clients: list[socket.socket] = []
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as server:
server.bind(("31.200.237.14", 50033))
server.listen(16)
def client_accepter():
while True:
user, addr = server.accept()
print(f"user connected: {addr}\n")
clients.append(user)
def sender():
while True:
message = input("\n").encode()
for user in clients:
user.send(message)
print("Starting server...")
Thread(target=client_accepter).start()
sender()
Client.py
import socket
with socket.socket() as client:
client.connect(("31.200.237.14", 50033))
print("Connected to server succesfully!")
while True:
data = client.recv(1024).decode()
if data:
print(data)
Ставлю внешний ip компа друга, он белый (и друг тоже), при попытке запустить
OSError: [WinError 10049] Требуемый адрес для своего контекста неверен
Во всех туторах про сокеты говорят, мол можно и во внешку сервер поставить, и переписываться с другом и т.д. и т.п. Но никто ни разу не показал как. Покажите пожалуйста
Ответы (1 шт):
Для того, чтобы ваше устройство-сервер было видно вне локальной сети, у роутеров есть функция проброса портов: если трафик идёт по определённому порту, то он перенаправляется с роутера на устройство, которое вы укажете.
Пример настройки проброса портов для роутера TP-Link:
- Заходим на сайт роутера (http://192.168.0.1 или http://192.168.1.1) и вводим данные для входа.
- Дополнительные настройки -> Переадресация NAT -> Виртуальные серверы -> Добавить
- Необходимые поля для заполнения — "внешний порт" (порт, к которому обращается клиент), "внутренний IP-адрес" (IP-адрес сервера в локальной сети) и "внутренний порт" (порт сервера, на который будет направлен трафик, можно написать внешний порт)
Учтите, что IP-адрес сервера нужно прописывать только в клиенте, у сервера же, в команде server.bind
, строку адреса лучше оставить пустой:
server.bind(("", 50033))