2010-01-16 15 views
5

Creé un pequeño programa de chat, que funciona sin problemas cuando el cliente & se ejecuta en el mismo equipo (y probablemente también en la red). Sin embargo, tan pronto como trato de conectarme a otra computadora a través de Internet, la conexión del socket simplemente agota el tiempo de espera. ¿Esto se debe a cortafuegos/enrutadores, etc.?Java Sockets & the Internet

¿Y cómo puedo conectar un Socket ServerSocket & a través de Internet?

Respuesta

4

Sin embargo, tan pronto como trato de conectarme a otra computadora a través de Internet, simplemente desconecta la conexión del socket. ¿Esto se debe a cortafuegos/enrutadores, etc.?

Sí, muy probablemente. Se está ejecutando el problema NAT: esencialmente, la misma dirección IP visible externamente se asigna a muchos puntos finales internamente visibles, y el punto extremo externo no sabe a qué punto extremo interno dar su solicitud de socket.

La forma más fácil de solucionar esto es a haga que sus clientes se conecten a un tercero que ambos puedan ver, y luego haga que el tercero medie la comunicación. Así es como funcionan la mayoría de los protocolos de mensajería instantánea, por ejemplo.

Si no tiene forma de controlar una entidad de terceros como esa, una alternativa para conectar directamente dos clientes es hacer que ambos clientes abran un puerto acordado y luego asignar las comunicaciones en ese puerto a su propio interno punto final Esto proporciona el enlace que falta para que el punto extremo externamente visible (por ejemplo, su enrutador doméstico) necesite entregar la comunicación a su destino previsto.

+0

Sí, pero me temo que no tengo un tercero ... – Jake

+0

@Jake: Sospeché que podría ser el caso - ver mi último párrafo. Básicamente, haga que su programa de chat use algún puerto arbitrario (si es IPv4, elija un número por encima de 1024, porque están reservados) y exija que ambos clientes tengan este puerto abierto en sus enrutadores. –

+1

@JohnFeminella Hola John, ¿me puedes dar un ejemplo o guiarme sobre cómo puedo escribir este módulo de "terceros" al que los clientes se pueden conectar? – asloob

0

Primero, verifique si realmente funciona en una LAN; suena como si estuvieras asumiendo que sí.

Si funciona en su red local, quizás esté fallando porque el servidor carece de una IP pública y se ejecuta detrás de un enrutador NAT.

+0

¿Cómo puedo saber si mi servidor carece de una IP pública?Tanto mi computadora portátil como mi iPod muestran la misma IP en whatismyip.com, ¿eso significa que mi servidor (portátil) no tiene una IP pública? – Jake

1

Si su servidor está detrás de un enrutador NAT (y la mayoría de las computadoras domésticas son, especialmente si usa WiFi), no será accesible desde afuera a menos que configure su enrutador para reenviar puertos a ese servidor.

¿Cuál es la IP de su computadora servidor? Si es 192.168.x.x o 10.x.x.x, entonces es una dirección no enrutable y no se puede contactar desde el exterior.

+0

Pero, ¿cómo pueden los servidores de todo el mundo (MSN, ICQ, correo, etc.) contactar a mi computadora? – Jake

+0

Bueno, el IP de la red local (como 192.168.xxx) es diferente de la IP de Internet (algo más, comprobado con whatismyip.com), pero las direcciones IP públicas son idénticas en mi iPod y computadora portátil .... – Jake

+0

Es su computadora que se conecta a ellos no al revés. Puede conectarse a cualquier nodo con una dirección IP pública. Si el servidor está detrás de un NAT, el rounter NAT se puede configurar para redirigir las conexiones y tal, pero esa es una pregunta del superusuario – notnoop

1

Suponiendo que se ejecuta en la misma computadora, quiere decir que le dice al cliente que el servidor está en 127.0.0.1/localhost, no debería ser un problema en su código, sino debido a cortafuegos o enrutadores. Si su servidor está detrás de un enrutador que realiza el enmascaramiento (es decir, el servidor no tiene una dirección IP pública pero privada como 192.168.xy, por ejemplo), debe configurar el enrutador para pasar una conexión de Internet a la computadora que ejecuta el enrutador. servidor.

Otra razón por la que no funciona podría ser la forma en que vincula su servidor a la interfaz. Si especifica 127.0.0.1 allí, el servidor solo escuchará las solicitudes provenientes del mismo sistema. Si no especifica una dirección, escuchará en todas las interfaces.

Editar Su comentario indica que de hecho tiene el problema de NAT como otros dijeron. La configuración de su enrutador en consecuencia es probablemente la solución más fácil.

Cuestiones relacionadas