2012-08-16 11 views
6

Sto cercando di usare di base Java per leggere i dati di richiesta HTTP da un InputStream, utilizzando il seguente codice:Lettura contenuto della richiesta da Java presa InputStream, si blocca sempre dopo un colpo di testa

BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 
      String inputLine; 
      while ((inputLine = in.readLine()) != null) 
       System.out.println(inputLine); 
      in.close(); 

ricevo l'intestazione bene, ma quindi il client si blocca per sempre perché il server non trova mai "EOF" della richiesta. Come gestisco questo? Ho visto questa domanda molto spesso, e la maggior parte delle soluzioni riguarda qualcosa come la precedente, tuttavia non funziona per me. Ho provato utilizzando sia ricciolo e un browser web come client, solo l'invio di una richiesta GET

Grazie per tutte le idee

richiesta
+1

Dove si trova il codice appeso? è 'readLine()' non sta tornando? –

+0

Sì, è appena bloccato su readLine() quando lo passo in un debugger – Hoofamon

risposta

10

Un HTTP termina con una riga vuota (eventualmente seguita da richiesta di dati come ad esempio i dati del modulo o un caricamento di file), non un EOF. Volete qualcosa di simile:

BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 
String inputLine; 
while (!(inputLine = in.readLine()).equals("")) 
    System.out.println(inputLine); 
in.close(); 
+0

Funziona perfettamente, grazie !!! – Hoofamon

+0

state cercando questa soluzione tutto il giorno. funziona come un fascino – sunrize920

+0

Fantastico, grazie! – tokudu

3

In aggiunta alla risposta di cui sopra (come io non sono in grado di pubblicare ancora commenti), vorrei aggiungere che alcuni browser come Opera (credo che fosse quello che ha fatto , o era il mio setup ssl, non so) inviare un EOF. Anche se non è il caso, ti piacerebbe impedirlo affinché il tuo server non si blocchi a causa di una NullPointerException.

Per evitare questo, basta aggiungere il test null per la sua condizione, in questo modo:

while ((inputLine = in.readLine()) != null && !inputLine.equals("")); 
Problemi correlati