2013-03-20 4 views
5

Beim Empfang von Daten mit readLine(), obwohl ich ein "\ n" am Ende der Nachricht mit der .flush beim Senden der Nachricht, die While-Schleife, die meine Nachricht liest immer noch blockiert . Nur beim Schließen der Socket-Verbindung verlässt es die Schleife.BufferedReader readLine() Blöcke

Hier ist der Client-Code:

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; 
} 

und den Code des Servers:

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(); 

Meine Codeblöcke auf dem Server while-Schleife. Danke.

+0

Setzen Sie Ihren Code in try/catch Block und schließen Sie die Streams/Verbindung in endlich blockieren. – happy

+1

Das scheint keine Frage zu haben. Möchten Sie wissen, warum dieses Verhalten auftritt? Wie man es verhindert? – Sinkingpoint

+1

Wenn Sie nur eine Zeile lesen möchten, warum while loop verwenden? –

Antwort

10

Der BufferedReader liest die Eingabe weiter bis zum Ende (Ende der Datei oder des Streams oder der Quelle usw.). In diesem Fall ist das "Ende" das Schließen des Sockels. Solange die Socket-Verbindung offen ist, wird Ihre Schleife ausgeführt, und der BufferedReader wartet nur auf weitere Eingaben und führt bei jedem Erreichen von '\ n' eine Schleife durch.

+0

mmm Ich dachte nicht, dass das Ende der Schließung der Steckdose war. Vielen Dank.Jetzt, wo ich es sehe, habe ich das Dokument falsch gelesen! – Majid

+0

Das Dokument ist ziemlich unklar, wenn es um den eof für Nicht-Datei-Streams geht. – Sinkingpoint

+0

Es ist die OP-Schleife, die bis EOS liest, nicht der BufferedReader. – EJP

3

Dies ist wegen der Bedingung in der while-Schleife: while((line = br.readLine()) != null)

Sie eine Zeile bei jeder Iteration lesen und die Schleife leve wenn readline null zurückgibt.

readLine gibt nur null zurück, wenn eof erreicht ist (= socked ist geschlossen) und gibt einen String zurück, wenn '\ n' gelesen wird.

, wenn Sie die Schleife auf readline beenden wollen, können Sie das gesamte while-Schleife und auslassen gerade tun:

line = br.readLine()

+0

Danke, ich kann das versuchen. – Majid

0

wenn Sie erhalten möchten, was in der Steckdose ist, ohne es zu schließen gezwungen zu sein, verwenden Sie einfach Object und Object ..

Beispiel:

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

Dies passiert, weil der InputStream nicht bereit ist, rot zu sein, also blockiert er in.readLine(). Bitte versuchen Sie dies:

boolean exitCondition= false; 

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

Natürlich müssen Sie die exitCondition steuern.

Eine andere Option kann die Verwendung von nio-Paket sein, das asynchrones (nicht blockierendes) Lesen ermöglicht, aber es hängt von Ihrem Bedarf ab.

0

habe ich versucht, viele Lösungen, aber die einzige, die ich gefunden, die Ausführung nicht versperrte war:

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

Die inStream.ready() gibt false zurück, wenn der nächste readLine() Aufruf der Ausführung blockiert.