Как починить сокеты питон??? 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 шт):

Автор решения: Mipsirint

Для того, чтобы ваше устройство-сервер было видно вне локальной сети, у роутеров есть функция проброса портов: если трафик идёт по определённому порту, то он перенаправляется с роутера на устройство, которое вы укажете.

Пример настройки проброса портов для роутера TP-Link:

  1. Заходим на сайт роутера (http://192.168.0.1 или http://192.168.1.1) и вводим данные для входа.
  2. Дополнительные настройки -> Переадресация NAT -> Виртуальные серверы -> Добавить
  3. Необходимые поля для заполнения — "внешний порт" (порт, к которому обращается клиент), "внутренний IP-адрес" (IP-адрес сервера в локальной сети) и "внутренний порт" (порт сервера, на который будет направлен трафик, можно написать внешний порт) Интерфейс настройки виртуального сервера

Учтите, что IP-адрес сервера нужно прописывать только в клиенте, у сервера же, в команде server.bind, строку адреса лучше оставить пустой: server.bind(("", 50033))

→ Ссылка