2015-02-09 2 views
0

Ну, пожалуйста, см. Вопрос this и первый ответ Джона Скита.Почему новый InputStream все еще будет читать то, что осталось от старого InputStream?

На этот раз у меня есть этот сервер:

public class SimpleServer { 
    public static void main(String[] args) throws Exception { 

     ServerSocket serverSocket = new ServerSocket(8888); 
     System.out.println("Server Socket created, waiting for client..."); 

     Socket accept = serverSocket.accept(); 
     InputStreamReader inputStreamReader = new InputStreamReader(accept.getInputStream()); 

     char[] chars = new char[5]; 

     System.out.println("Client connected, waiting for input"); 

     while (true) { 
      inputStreamReader.read(chars,0,chars.length); 
      for (int i=0;i<5;i++) { 
       if(chars[i]!='\u0000') { 
        System.out.print(chars[i]); 
       } 
      } 
      inputStreamReader = new InputStreamReader(accept.getInputStream()); 
      chars = new char[5]; 
     } 

    } 
} 

И когда я посылаю символы «123456789» от клиента, это то, что я точно вижу в терминале Сервера, но я не должен видеть только 12345 ?

Почему разница в поведении?

ответ

2

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

Попробуйте изменить код на сервере, чтобы читать только символов одновременно, а не 5 (но оставить клиента, отправляющего 5), и вы вполне можете увидеть разницу в поведении. Вы may нет, заметьте - это будет зависеть от множества разных вещей вокруг момента, когда данные перемещаются.

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

+0

Спасибо за ответ, на этот раз я увижу: «123678» на выходе терминалов серверов. 4 и 5 потеряно, но он все еще может читать 678 .. Очень запутанно для меня .. –

+0

@KorayTugay: Это потому, что 4 и 5 были в первом «пакете» данных, отправленных с клиента на сервер, и были прочитаны в буфера первого 'InputStream'. 6789 были отправлены в следующем пакете, поэтому они не были прочитаны (как это бывает) первым читателем и все еще «в» потоке. –

+0

Спасибо большое, понял. –

Смежные вопросы