2016-10-12 5 views
1

У меня есть следующая проблема. Я запрограммировал простой Echo-сервер и Echo-клиент, но проблема в том, что в цикле Сервера, где я читал из буферизованного считывателя, программа застревает, и она не будет писать.PrintWriter не будет писать

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 

Но когда я поставил .println() и .flush() в цикле все прекрасно работает.

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 

Мой вопрос: почему он застревает в петле?

ответ

2

Вы читаете входную линию до конца потока, прежде чем отправлять что-либо. Конец потока в сокете возникает только тогда, когда партнер завершает соединение. Партнер не закрыл соединение, потому что он хочет прочитать ваш ответ.

Вы должны повторять каждую строку, когда вы ее читаете, а не пытаться собрать их все, а затем эхо их всех в одном большом куске. Помимо того, что он не может работать, ваша техника также тратит время и пространство.

+0

Thx для вашего ответа. Да, я ожидал, что Stream даст null, когда он пуст. Но, конечно, это не имеет смысла. Но читать текст, который является переменным в его длине и строках. Есть ли что-то подобное в методе 'Scanner'' hasNext() '. Чтобы обеспечить, чтобы, когда весь текст читается, сервер выходит из Loop? – Torben