2011-04-17 18 views
5

Estoy tratando de conectarme al servidor usando un socket Java. Estoy tratando de conectar desde el puerto 80 a 90Bloques de socket Java en la conexión a un servidor

int port; 
Socket clientsocket; 
String hostname = "www.google.com"; 

for(port = 80;port<=90; port++){ 
    try{ 
    clientsocket = new Socket(hostname,port); 
    System.out.println("Connection at port " + port + "\t" + clientsocket.isConnected()); 
    clientsocket.close(); 
    } 
    catch(Exception e){ 
    System.out.println(e.getMessage()); 
    } 
} 

Cuando intento conectar a cualquier sitio web como google.com o w3schools.com mi programa se cuelga en la llamada socket() de números de puerto, excepto 80. Desde esos sitios web no están sirviendo en los puertos 81-90, debería elevar la excepción, pero en su lugar se bloquea. Para el puerto 80 funciona bien. Cuando intento conectarme al servidor apache instalado en mi máquina, no bloquea ningún número de puerto y me da error de conexión rechazada, que es el comportamiento obvio. Entonces, ¿por qué está sucediendo? Gracias por adelantado.

+0

un problema similar http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4232651 – Durin

+0

No es su código, incluso telnet www.google.com 81 veces fuera. – lobster1234

+0

@ lobster1234: gracias por la respuesta. el código que escribí arriba es mi código. El enlace al error por supuesto no es mío. – Durin

Respuesta

13

Cuando intento conectarme a cualquier sitio web como google.com o w3schools.com mi programa se cuelga en el socket() llamada para números de puerto excepto 80. Dado que esos sitios web no están sirviendo en los puertos 81-90 debería elevar la excepción, pero en su lugar se bloquea.

Es casi seguro que Java no lo está haciendo.

Cuando invoque el constructor Socket(String, int), la JVM le pide al sistema operativo que intente establecer una conexión con la dirección IP correspondiente al nombre proporcionado, utilizando el número de puerto suministrado. Suponiendo que estamos hablando de TCP/IP, el sistema operativo manda un mensaje de 'SYN' TCP, y espera una respuesta:

  • Si la respuesta es un 'SYN-ACK', se procede a establecer la conexión según el protocolo; ver http://en.wikipedia.org/wiki/Transmission_Control_Protocol#Connection_establishment.

  • Si la respuesta es un 'RST' (reinicio), la conexión falla y esto da como resultado una excepción de Java "conexión rechazada". (Esto es típicamente lo que sucede si el 'SYN' llega al servidor remoto, solo para descubrir que no hay ninguna aplicación "escuchando" en el puerto que intentó conectar).

  • Si la respuesta es un ICMP mensaje de algún tipo (por ejemplo, el destino ICMP inalcanzable), esto normalmente da como resultado una falla inmediata de la solicitud de conexión y una excepción de Java.

  • Si no hay respuesta, el sistema operativo intenta una y otra vez. Según el tiempo de espera de conexión predeterminado de Java (o el tiempo de espera explícito), este proceso podría continuar durante mucho tiempo.

Lo más probable es que algo esté filtrando los mensajes 'SYN' en los puertos funky, y simplemente tirándolos. Podría ser el software de firewall local en su PC, el software de firewall en su puerta de enlace o la red de su ISP, o el software en el sistema remoto con el que está tratando de hablar. O esto podría estar sucediendo al mensaje 'SYN-ACK' que regresa.

De cualquier forma, el comportamiento de bloqueo/tiempo de espera es inherente a la red TCP/IP, y es imposible diagnosticar con precisión ni en el sistema operativo ni en los niveles de Java. Simplemente necesitas ajustar tus expectativas. (O establezca un tiempo de espera de conexión más corto ...)

+0

que estaba tan bien escrito y esclarecedor. Gracias una tonelada. – Durin

+0

Una causa común podría ser un proxy. – tkruse

Cuestiones relacionadas