2010-02-05 10 views
28

Tengo un servidor Java que abre un socket usando ServerSocket (usando Thrift con él). Este servidor tiene un cliente en la máquina local en Obj-c que se comunica con el servidor Java. Todo sucede en localhost. En este momento, el servidor de Java también está visible en la red. Me gustaría que solo se pueda acceder al servidor de Java en el host local. De lo contrario, es una vulnerabilidad de seguridad potencial y asusta a los usuarios cuando su firewall les advierte.¿Cómo crear un socket Java que sea localhost solamente?

He intentado crear el socket del servidor usando un InetSocketAddress ('localhost', 9090) pero parece que no tiene ningún efecto. ¿Cómo puedo limitar esto al localhost?

+0

Si del servidor sólo se puede acceder en el servidor local, la forma en que los clientes acceder a él? No entiendo la configuración. –

+1

@Kaleb - citando la pregunta: "Este servidor tiene un cliente en la máquina local ... Todo sucede en el host local". –

+0

Compruebe esta otra pregunta y las respuestas dadas: [Cómo determinar una conexión entrante desde la máquina local] (http://stackoverflow.com/questions/1542424/how-to-determine-an-incoming-connection-is-from -local-machine) –

Respuesta

20

Trate

new ServerSocket(9090, 0, InetAddress.getByName("localhost")) 

El último parámetro al constructor especifica qué dirección para enlazar el socket de escucha a.

+6

+1 - pero tenga en cuenta que algunas máquinas no entienden "localhost". Entonces, usar la dirección IP 127.0.0.1 es probablemente más robusto. –

+0

¿Realmente es así como funciona el constructor? Publiqué esa sugerencia, pero después de volver a leer la descripción, pensé que parecía que el constructor solo elige una conexión de red para aceptar conexiones, en lugar de todas (si el sistema tiene más de un dispositivo de red). –

+3

@Stephen que podría causar problemas en el futuro con un host que es principalmente IPv6 o incluso IPv6 solamente. –

3
new ServerSocket(9090, 0, InetAddress.getByName(null)); 
37

Taken from another question:

new ServerSocket(9090, 0, InetAddress.getByName(null)); 

InetAddress.getByName(null) apunta a la dirección de bucle invertido (127.0.0.1)

Y here's el Javadoc donde dice que

+4

Probado en android, getByName (null) no funciona (no se puede conectar al socket abierto de esta manera sin importar qué). getByname ("127.0.0.1 ") funciona, funciona instantáneamente y es en mi humilde opinión más legible y" portátil " –

+1

Acabo de encontrar esto. Interesante. Y ahora está el método' InetAddress.getLoopbackAddress() ' – JayC667

14

Let me interrumpiría con una solución alternativa que solo acepta en el dispositivo loopback. Todas las otras soluciones de "localhost" harán que Java elija una interfaz.

new ServerSocket(9090, 0, InetAddress.getLoopbackAddress()); 

Este servicio está disponible desde Java 7, y ni siquiera tirar UnknownHostException

Cuestiones relacionadas