Conexión de socket a través de internet en Python?

He creado un progtwig de socket de servidor de cliente básico en Python 2.7.x y se está ejecutando absolutamente bien en la misma red incluso en diferentes máquinas, pero cuando ejecuto el servidor y el cliente en diferentes redes (servidor en la red de mi amigo y cliente en el mío) No devuelve ningún error y sigue esperando. Simplemente no puedo entender cómo depurar el código. Estoy usando el puerto 80 al eliminar todos los servicios en el puerto 80. También he realizado el reenvío de puertos en el puerto 80 en ambas máquinas.

Mis códigos son los siguientes:

cliente.py

import socket s = socket.socket() host = '103.47.59.130' port = 80 s.connect((host, port)) while True: print "From Server: ", s.recv(1024) #This gets printed after sometime s.send(raw_input("Client please type: ")) s.close() 

server.py

 import socket s = socket.socket() # Create a socket object host = '192.168.0.104' #private ip address of machine running fedora port = 80 s.bind((host, port)) s.listen(5) c, addr = s.accept() print 'Got connection from', addr #this line never gets printed while True: c.send(raw_input("Server please type: ")) print "From Client: ", c.recv(1024) c.close() 

A veces sale ** del servidor: ** pero no envía ningún mensaje de un lado a otro.

PD: He buscado en Stack Overflow anteriormente pero no puedo encontrar nada relevante.

Utilice este software para implementar el reenvío de puertos. Le recomiendo que use otro puerto para su servidor, digamos 5006, para evitar cualquier problema relacionado con el uso de un puerto muy utilizado como 80. Básicamente, el software funciona así:

  • Hace clic en Conectar, busca los enrutadores y, si encuentra el suyo, enumera las asignaciones de puertos existentes.
  • Se crea una asignación de puertos (a la derecha), el protocolo predeterminado es TCP
  • Selecciona un puerto en su enrutador, digamos 5001 (llamado puerto externo)
  • Selecciona un puerto en su servidor, tal vez 5006 (llamado puerto interno)
  • Luego se le indicará al enrutador que reenvíe todos los datos que llegan al puerto 5001 a su servidor, utilizando su IP privada, específicamente al puerto 5006 de su servidor.

Así que todo lo que tiene que hacer su cliente es enviar datos a la IP pública de su servidor, específicamente al puerto 5001. Por supuesto, estos datos primero llegarán a su enrutador, que se comportará como configurado y reenviará todo al puerto 5006 de su servidor. Todo esto Sólo funciona si su puerta de enlace de Internet admite el reenvío de puertos.

Cliente:

 import socket s = socket.socket() host = '103.47.59.130' port = 5001 s.connect((host, port)) while True: try: print "From Server: ", s.recv(1024) s.send(raw_input("Client please type: ")) except: break s.close() 

Servidor:

 import socket s = socket.socket() # Create a socket object host = '192.168.0.104' #private ip address of machine running fedora port = 5006 s.bind((host, port)) s.listen(5) c, addr = s.accept() print 'Got connection from', addr while True: c.send(raw_input("Server please type: ")) print "From Client: ", c.recv(1024) c.close() 

Debe usar su dirección IP pública o 0.0.0.0 en su servidor, y asegurarse de que su módem / enrutador permita conexiones entrantes en el puerto especificado (generalmente denominado reenvío de puertos).

¡Espero eso ayude!

Parece que necesitas realizar una solución de problemas de red básica. Su descripción dice que puede conectarse a otras máquinas en su propia red, pero no a una máquina en otra red. Puede probar el mismo tipo de pruebas en la máquina en la otra red: puede conectarse a otras máquinas en su propia red, puede conectarse a otras máquinas fuera de su red.

Algunas herramientas que son muy valiosas incluyen ping, tracepath, tcpdump y nc (netcat).

En última instancia, si puede establecer la conexión con netcat, puede asumir que el problema está en su código, pero si no puede, puede intentar encontrar el problema de red.