2016-10-12 6 views
1

Ich habe das folgende Problem. Ich habe einen einfachen Echo Server und Echo Client programmiert, aber das Problem ist, dass in der Schleife des Servers, wo ich vom gepufferten Reader lese, das Programm stecken bleibt und es nicht schreiben wird.PrintWriter wird nicht schreiben

import java.net.*; 
import java.util.*; 
import java.io.*; 
public class SimpleServer { 
    public static void main(String[] args) { 
    System.out.println("Dies ist ein simpler Echo Server"); 
    int port = 6000; 
    try { 
     ServerSocket server = new ServerSocket(port);      
     //server.setSoTimeout(30000);          
     System.out.println("Warte auf anfrage");        
     Socket client = server.accept();         
     InputStream is = client.getInputStream();   
     InputStreamReader isr = new InputStreamReader(is);     
     BufferedReader reader = new BufferedReader(isr);     
     String message = null;            
     while ((message = reader.readLine())!=null) {      
     System.out.println("Nachricht vom Client "+message);    
     } 
     OutputStream os = client.getOutputStream();       
     PrintWriter writer = new PrintWriter(os);       
     System.out.println(message); 
     writer.println(message);           
     writer.flush();              

     writer.close();              
    } catch(IOException e) { 
     e.printStackTrace(); 
    } // end of try 
    } // end of main 
} // end of class SimpleServer 

Aber wenn ich die .println() und .flush() in der Schleife setzen alles funktioniert super.

import java.net.*; 
import java.util.*; 
import java.io.*; 
public class SimpleServer { 
    public static void main(String[] args) { 
    System.out.println("Dies ist ein simpler Echo Server"); 
    int port = 6000; 
    try { 
     ServerSocket server = new ServerSocket(port);      
     //server.setSoTimeout(30000);          
     System.out.println("Warte auf anfrage");        
     Socket client = server.accept();          
     InputStream is = client.getInputStream();        
     InputStreamReader isr = new InputStreamReader(is);     
     BufferedReader reader = new BufferedReader(isr);       
     OutputStream os = client.getOutputStream();       
     PrintWriter writer = new PrintWriter(os);       
     String message;              
     while ((message = reader.readLine())!=null) {      
     System.out.println("Nachricht vom Client "+message);    
     writer.println(message);           
     writer.flush();              
     } 
     writer.close();              
    } catch(IOException e) { 
     e.printStackTrace(); 
    } // end of try 
    } // end of main 
} // end of class SimpleServer 

Meine Frage ist, warum es in der Schleife stecken?

Antwort

2

Sie lesen das Inpit bis zum Ende des Streams, bevor Sie etwas senden. Das Ende des Streams auf einem Socket tritt nur auf, wenn der Peer die Verbindung schließt. Der Peer hat die Verbindung nicht geschlossen, weil er Ihre Antwort daraus lesen möchte.

Sie sollten jede Zeile wiederholen, während Sie es lesen, nicht versuchen, sie alle zusammenzufügen und dann alle in einem großen Stück zu echo. Abgesehen von der Tatsache, dass es nicht funktionieren kann, verschwendet Ihre Technik auch Zeit und Raum.

+0

Thx für Ihre Antwort. Ja, ich habe erwartet, dass der Stream eine Null gibt, wenn er leer ist. Aber natürlich macht das keinen Sinn. Aber um Text zu lesen, der in seiner Länge und seinen Zeilen variabel ist. Gibt es etwas Ähnliches die 'Scanner' Methode' hasNext() '. Um sicherzustellen, dass der Server nach dem Lesen des gesamten Textes den Loop verlässt? – Torben

Verwandte Themen