2010-07-21 16 views
14

Sto provando a scrivere un programma java che scaricherà e chiamerà automaticamente alcuni dei miei fumetti preferiti. Dal momento che richiederò più oggetti dallo stesso dominio, volevo avere una connessione http persistente che potessi tenere aperta fino a quando tutti i fumetti non saranno stati scaricati. Di seguito è il mio lavoro in corso. Come faccio a fare un'altra richiesta dallo stesso dominio ma percorso diverso senza aprire una nuova connessione http?HttpURLConnection persistente in 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); 
     } 
    } 
} 

risposta

16

Secondo il , la persistenza HTTP viene gestita in modo trasparente in Java, anche se ti dà le opzioni per controllare troppo via http.keepAlive e http.maxConnections proprietà del sistema.

Tuttavia,

L'implementazione corrente non fa tampone corpo della risposta. Il che significa che l'applicazione deve terminare leggendo il corpo della risposta o chiamare close() per abbandonare il resto del corpo di risposta , in modo che la connessione possa essere riutilizzata. Inoltre, l'implementazione attuale non tenterà la lettura di blocchi durante la pulizia della connessione , ovvero se l'intero corpo di risposta non è disponibile, la connessione non verrà riutilizzata.

Dai un'occhiata al link e vedi se ti aiuta davvero.

+0

collegamento è morto? inoltre si applica ancora alle versioni più recenti di Java? – rogerdpack

+1

@royerdpack Ovviamente lo fa. Non puoi seriamente credere che prenderebbero una caratteristica importante come questa. – EJP

+0

@rogerdpack Usa la ricerca Google in questo modo la prossima volta: https://www.google.com/search?q=java+api+doc+net%2Fhttp-keepalive.html Nel frattempo sto correggendo il link. – yclian

6

Per impostazione predefinita, HttpURLConnection è abbastanza intelligente da riutilizzare una connessione allo stesso host se keep-alive è abilitato dall'host.

Tuttavia, la gestione degli errori è debole e si potrebbe entrare in una situazione in cui client e host non sono sincronizzati e la connessione si blocca. Pertanto, disabilitiamo sempre keep-alive.

+0

Avete dei collegamenti a docu su HttpURLConnection riutilizzare le connessioni? La mia vera domanda è ... se creo ogni volta un oggetto URL, come 'new URL (urlString) .openConnection();' usa un pool di connessioni se disponibile ... – rogerdpack

+1

@rogerdpack Ecco alcuni documenti: http: //docs.oracle.com/javase/6/docs/technotes/guides/net/http-keepalive.html Per rispondere alla tua domanda, sembra che ("è" l'implementazione della piattaforma) utilizza un pool di connessioni, quindi la creazione di un oggetto URL per ogni richiesta riutilizzerebbe ancora le connessioni. – Jeff

+0

La somma ha qualche videmceevid mentre la gestione degli errori è debole e il client e il server non sono più sincronizzati? L'aneddoto non raccolto non è sufficiente. – EJP

2

In base a questo collegamento http://docs.oracle.com/javase/6/docs/technotes/guides/net/http-keepalive.html, il riutilizzo della connessione HTTP è abilitato per impostazione predefinita, è possibile utilizzare Wireshark per verificare le interazioni tra client e server. La prima richiesta contiene handshake TCP e SSL (se la tua richiesta è https), le richieste successive attivate nel tempo keep-alive, non contiene alcun handshake TCP e SSL, ma solo trasferimenti di dati dell'applicazione.

Problemi correlati