Не работает p2p чат в сети

Рейтинг: 1Ответов: 0Опубликовано: 05.06.2023

Есть код консольного TCP мессенджера на Python:

import threading
import socket

HOST = input('Enter IPv4: ~')

PORT_TO = int(input('Enter PORT_TO: ~'))
PORT_FROM = int(input('Enter PORT_FROM: ~'))

KEY = int(input('Enter key (number): ~'))

STOPPED = False

def encodeCrypt(data, key):
    return data


def decodeCrypt(data, key):
    return data


def server_part(host, port, keyCrypt):
    global STOPPED
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.bind((host, port))
        s.listen()
        conn, addr = s.accept()
        with conn:
            print(f"Connected by {addr}")
            while not STOPPED:
                data = input()
                print(f"[YOU]: {data}")
                encryptedData = encodeCrypt(data, keyCrypt).encode()
                conn.sendall(encryptedData)
                if data == '!stop!':
                    print('[connection is closing]')
                    STOPPED = True
                    exit()
                    break
            exit()
        exit()
    exit()

def client_part(host, port, keyCrypt):
    global STOPPED
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.connect((host, port))
        i = 0
        while not STOPPED:
            i += 1
            data = decodeCrypt(s.recv(1024), keyCrypt).decode()
            print('[SOMEONE]:', data)
            if data == '!stop!':
                print('[connection is closing]')
                STOPPED = True
                exit()
                break
        exit()
    exit()


thread_server = threading.Thread(target=server_part, args=(HOST, PORT_TO, KEY))
thread_server.start()
input('press enter when 2nd person enters key | if u are 2nd person press immediately')
thread_client = threading.Thread(target=client_part, args=(HOST, PORT_FROM, KEY))
thread_client.start()

Когда я запускаю 2 раза этот файл в Win10, и затем на порты ввожу:

IP: 127.0.0.1
TO: 2000
FROM: 2001
KEY = 0

А в другом окне меняю FROM и TO. То все работает, все сообщения приходят как надо. Пояснение - здесь 2 сервера и два клиента на разных портах. А когда я пытаюсь запустить код на двух разных компьютераХ, зная их глобальный IPv4, то вылетает ошибка:

Exception in thread Thread-1 (server_part):
Traceback (most recent call last):
  File "C:\Users\foton\AppData\Local\Programs\Python\Python310\lib\threading.py", line 1016, in _bootstrap_inner
    self.run()
  File "C:\Users\foton\AppData\Local\Programs\Python\Python310\lib\threading.py", line 953, in run
    self._target(*self._args, **self._kwargs)
  File "C:\Users\foton\PycharmProjects\foton9thsectionchat\f9chat.py", line 25, in server_part
    s.bind((host, port))
OSError: [WinError 10049] Требуемый адрес для своего контекста неверен

Возможно это что-то с фаерволом, но у меня разрешены все подключения к сети для Python.

В любом случае вопрос как исправить это?

Пример чата локально: введите сюда описание изображения

Ответы

Ответов пока нет.