Q: (python) Socket nao conecta com rede externa Estou tentando fazer um chat em python, porem o script server só se conecta com o client.py se a máquina do cliente estiver conectada na mesma rede. Como eu posso fazer para os dois se conectarem em redes diferentes (remotamente)? Segue o codigo server.py:
import socket
import subprocess
import threading


#IP = "localhost"
PORT = 4444 

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('', PORT)) #server.bind((IP, PORT))

server.listen(1)
print("[+] Serv startado")


client, client_addr = server.accept()
print(f" {client_addr} O cliente abriu o chat")

def enviar():
    global client, client_addr

    while True:
        msg = input("MSG>>> ")
        msg = msg.encode()
        client.send(msg)
        print("Mensagem enviada!")

def receber():
    global client, server

    while True:
        msg2 = client.recv(1024)
        msg2 = msg2.decode(encoding = 'UTF-8',errors = 'ignore')
        print("\nOutput: ", msg2)
    

threading.Thread(target=enviar).start()
threading.Thread(target=receber).start()

E agora, client.py:
import socket 
import subprocess
import threading


SERV_IP = socket.gethostname()
#SERV_IP = "192.168.1.105" 
SERV_PORT = 4444

back = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
back.connect((SERV_IP, SERV_PORT))

def receber():
    global back
    while True:
        msg = back.recv(1024)
        msg = msg.decode() #encoding = 'UTF-8',errors = 'ignore'
        print("\nOutput: ", msg)
        

def enviar():
    global back
    while True:
        msg2 = input("MSG>>> ")
        msg2 = msg2.encode()
        back.send(msg2)
        print("Mensagem enviada!")

threading.Thread(target=receber).start()
threading.Thread(target=enviar).start()


Des de ja, obrigado!

A: O problema é que server.py não conhece o caminho até o client.py se eles não estão na mesma rede.
Abra o seu prompt de comando e execute o seguinte comando:
tracert google.com.br

Vai notar que existem vários endereços IPs saindo deste o seu provedor de internet, passando pelos roteadores e outros servidores até chegar no IP final. Copie esse último IP e coloque ele no seu navegador, verá que vai abrir a página do Google. Esse é o IP público do Google, você consegue acessar o site pois você conhece o seu ip.
Para conectar o seu server.py ao seu client.py você pode fazer algumas coisas.
Você pode usar o Hamachi, ele é um programa de computador que simula uma Rede local.
Ou você deve colocar o seu arquivo server.py hospedado em algum servidor na web, depois fazer o client.py conectar com o server.py usando o ip público do servidor. Você só consegue fazer esse tipo de coisa se você tiver um ip público.
Uma outra coisa que você pode tentar fazer é utilizar uma técnica chamada de tcp ou udp hole punching, pesquise por esses termos.
Que funciona mais ou menos assim:
Você tem um Servidor, um Cliente A e um Cliente B.
O Cliente A se conecta ao Servidor.
O Cliente B se conecta ao Servidor.
O Servidor envia para o Cliente A o IP do Cliente B.
O Servidor envia para o Cliente B o IP do Cliente A.
O Cliente A pega esse IP e conecta com o Cliente B.
O Cliente A e B se desconectam do Servidor.
O Cliente A e B podem estar em suas redes locais, mas o Servidor precisa estar em uma rede pública. Os arquivos Torrent funciona dessa forma.
