2013-03-20 1 views
5

Durante la ricezione di dati tramite readLine(), anche se ho inserito un "\ n" alla fine del messaggio utilizzando .flush quando si invia il messaggio, il ciclo while che legge il messaggio continua a bloccare . Solo quando chiude la connessione socket, lascia il loop.BufferedReader readLine() blocca

Ecco il codice del client:

bos = new BufferedOutputStream(socket. 
      getOutputStream()); 
bis = new BufferedInputStream(socket. 
      getInputStream()); 
osw = new OutputStreamWriter(bos, "UTF-8"); 
osw.write(REG_CMD + "\n"); 
osw.flush(); 

isr = new InputStreamReader(bis, "UTF-8"); 
BufferedReader br = new BufferedReader(isr); 

String response = ""; 
String line; 

while((line = br.readLine()) != null){ 
    response += line; 
} 

e il codice del server:

BufferedInputStream is; 
BufferedOutputStream os; 

is = new BufferedInputStream(connection.getInputStream()); 
os = new BufferedOutputStream(connection.getOutputStream()); 

isr = new InputStreamReader(is); 

String query= ""; 
String line; 

while((line = br.readLine()) != null){ 
    query+= line; 
} 

String response = executeMyQuery(query); 
osw = new OutputStreamWriter(os, "UTF-8"); 

osw.write(returnCode + "\n"); 
osw.flush(); 

miei blocchi di codice al server mentre loop. Grazie.

+0

Inserire il codice nel blocco try/catch e chiudere gli stream/connessioni nel blocco finally. – happy

+1

Questo non sembra avere una domanda in esso. Vuoi sapere perché questo comportamento si verifica? Come prevenirlo? – Sinkingpoint

+1

Se si desidera leggere solo una riga perché utilizzare il ciclo while? –

risposta

10

BufferedReader continua a leggere l'input fino alla fine (fine del file o flusso o origine, ecc.). In questo caso, la "fine" è la chiusura del socket. Quindi, finché la connessione Socket è aperta, il ciclo verrà eseguito e BufferedReader attenderà solo più input, eseguendo il loop ogni volta che viene raggiunto un \ n '.

+0

mmm Non pensavo che quella fine fosse la chiusura della presa. Grazie.Ora che lo guardo, ho letto male il documento! – Majid

+0

Il documento è piuttosto ambiguo quando si tratta dell'uscita di flussi non file. – Sinkingpoint

+0

È il ciclo dell'OP che continua a leggere fino a EOS, non a BufferedReader. – EJP

3

Questo è a causa della condizione del ciclo while: while((line = br.readLine()) != null)

si legge una riga su ogni iterazione e leve del ciclo se readLine torna null.

readLine restituisce solo null, se viene raggiunto eof (= socked è chiuso) e restituisce una stringa se viene letto '\ n'.

se si vuole uscire dal ciclo sul readLine, è possibile omettere l'intero ciclo while und basta fare:

line = br.readLine()

+0

Grazie, posso provarlo. – Majid

0

se si vuole ottenere ciò che è nella presa di corrente, senza essere costretti a chiuderlo è sufficiente utilizzare ObjectInputStream e ObjectOutputStream ..

Esempio:

ObjectInputStream ois; 
ObjectOutputStream oos; 

ois = new ObjectInputStream(connection.getInputStream()); 

String dataIn = ois.readUTF(); //or dataIn = (String)ois.readObject(); 

oos = new ObjectOutputStream(connection.getOutputStream()); 
oos.writeUtf("some message"); //or use oos.writeObject("some message"); 
oos.flush(); 

..... 
0

Questo accade perché InputStream non è pronto per essere rosso, quindi blocca su in.readLine(). Si prega di provare questo:

boolean exitCondition= false; 

while(!exitCondition){ 
    if(in.ready()){ 
     if((line=in.readLine())!=null){ 
      // do whatever you like with the line 
     } 
    } 
} 

Naturalmente si deve controllare l'exitCondition.

Un'altra opzione può essere l'utilizzo del pacchetto nio, che consente la lettura asincronizzata (non bloccante) ma dipende dalle necessità dell'utente.

0

Ho provato un sacco di soluzioni, ma l'unico che ho trovato che non è stato il blocco di esecuzione era:

BufferedReader inStream = new BufferedReader(new 
InputStreamReader(yourInputStream)); 
String line; 
while(inStream.ready() && (line = inStream.readLine()) != null) { 
    System.out.println(line); 
} 

I inStream.ready() restituisce false se la prossima readLine() chiamata bloccare l'esecuzione.