2010-07-21 17 views
14

Estoy tratando de escribir un programa de Java que se descargará automáticamente y nombrará algunos de mis cómics web favoritos. Como solicitaré varios objetos del mismo dominio, quería tener una conexión HTTP persistente que pudiera mantener abierta hasta que se hayan descargado todos los cómics. A continuación está mi trabajo en progreso. ¿Cómo realizo otra solicitud desde el mismo dominio pero con una ruta diferente sin abrir una nueva conexión http?HttpURLConnection persistente en Java

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.HttpURLConnection; 
import java.net.URL; 

public class ComicDownloader 
{ 
    public static void main(String[] args) 
    { 
     URL url = null; 
     HttpURLConnection httpc = null; 
     BufferedReader input = null; 

     try 
     { 
      url = new URL("http://www.cad-comic.com/cad/archive/2002"); 
      httpc = (HttpURLConnection) url.openConnection(); 
      input = new BufferedReader(new InputStreamReader(httpc.getInputStream())); 
      String inputLine; 

      while ((inputLine = input.readLine()) != null) 
      { 
       System.out.println(inputLine); 
      } 

      input.close(); 
      httpc.disconnect(); 
     } 
     catch (IOException ex) 
     { 
      System.out.println(ex); 
     } 
    } 
} 

Respuesta

16

De acuerdo con la , la persistencia de HTTP está siendo manejado de forma transparente en Java, a pesar de que le da las opciones para controlar también a través de http.keepAlive y http.maxConnections propiedades del sistema.

Sin embargo,

La implementación actual no a amortiguar el cuerpo de la respuesta. Lo que significa que la aplicación tiene que terminar leyendo el cuerpo de la respuesta o llamar al cerrar() para abandonar el resto del cuerpo de respuesta , para que se reutilice la conexión . Además, la implementación actual de no intentará lectura de bloque al limpiar la conexión , lo que significa que si el cuerpo de respuesta completo no está disponible, la conexión no se reutilizará.

Eche un vistazo al enlace y vea si realmente lo ayuda.

+0

link is dead? también se aplica a las versiones más nuevas de java? – rogerdpack

+1

@royerdpack Por supuesto que sí. No se puede creer seriamente que sacarían una característica valiosa como esta. – EJP

+0

@rogerdpack Use una búsqueda de Google como esta la próxima vez: https://www.google.com/search?q=java+api+doc+net%2Fhttp-keepalive.html Mientras tanto, estoy corrigiendo el enlace. – yclian

6

De forma predeterminada, HttpURLConnection es lo suficientemente inteligente como para reutilizar una conexión con el mismo host si el host mantiene activada la función keep-alive.

Sin embargo, el manejo de errores es débil y puede llegar a una situación en la que el cliente y el host no estén sincronizados y la conexión simplemente se cuelgue. Por lo tanto, siempre desactivamos keep-alive.

+0

¿Tiene algún enlace? documentar en HttpURLConnection reutilizando conexiones? Mi verdadera pregunta es ... si actualizo un objeto URL cada vez, como 'new URL (urlString) .openConnection();' usa un grupo de conexiones si está disponible ... – rogerdpack

+1

@rogerdpack Aquí hay un poco de documentación: http: //docs.oracle.com/javase/6/docs/technotes/guides/net/http-keepalive.html Para responder a su pregunta, parece que ("it" es la implementación de la plataforma) utiliza un grupo de conexiones, por lo que renovar un objeto de URL para cada solicitud reutilizaría las conexiones. – Jeff

+0

¿Tiene algún videmceevid y el manejo de errores es débil y el cliente y el servidor no están sincronizados? Anécdota sin fuente no es suficiente. – EJP

2

De acuerdo con este enlace http://docs.oracle.com/javase/6/docs/technotes/guides/net/http-keepalive.html, la reutilización de la conexión HTTP está habilitada de manera predeterminada, puede usar Wireshark para verificar las interacciones entre su cliente y el servidor. La primera solicitud contiene el protocolo de enlace TCP y SSL (si su solicitud es https), las solicitudes subsiguientes activadas en el tiempo de mantenimiento activo, no contiene ningún protocolo de enlace TCP y SSL, solo transferencia de datos de la aplicación.

Cuestiones relacionadas