2016-08-15 8 views
0

Откат кода клиента. В основном он считывает со стандартного ввода и отправляет сообщение серверу.Как «очистить» InputStream, не закрывая его?

public static void main(String[] args) { 

    try (Socket socket = new Socket("localhost", 1200)) { 
     OutputStreamWriter writer = new OutputStreamWriter(socket.getOutputStream(), StandardCharsets.US_ASCII); 

     Scanner scanner = new Scanner(System.in); 
     for (String msg = scanner.nextLine(); !msg.equals("end"); msg = scanner.nextLine()) { 
      writer.write(msg + "\n"); 
      writer.flush(); 
     } 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

Фрагмент кода сервера. Распечатывает сообщение из потока.

public void run() { 

    try (InputStreamReader reader = new InputStreamReader(this.socket.getInputStream(), StandardCharsets 
      .US_ASCII)) { 

     StringBuilder builder = new StringBuilder(); 

     for (int c = reader.read(); c != -1; c = reader.read()) { 

      builder.append((char) c); 
      if ((char) c == '\n') 
       System.out.print(builder); 
     } 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

Входной сигнал от клиента:

Text1 
Text2 

выход Сервер:

Text1 
Text1 
Text2 

Проблема я столкнулся, что сервер печатает не только что получил сообщение, но и все сообщения до него.

Вопрос: Как сбросить «чистый» InputStream, не закрывая его. И если это невозможно, то что является предпочтительным решением?

ответ

2

Вам не нужно «очищать» поток - вам просто нужно сбросить буфер после каждой строки. Попробуйте что-то вроде следующего, используя StringBuilder.setLength:

if (c == '\n') { 
    System.out.print(builder.toString()); 
    builder.setLength(0); 
} 

С другой стороны, я настоятельно рекомендую не вручную чтения строк, как это. Подумайте об использовании Scanner, как в коде клиента, или в качестве альтернативы BufferedReader.

try (final BufferedReader reader 
     = new BufferedReader(new InputStreamReader(socket.getInputStream(), StandardCharsets.US_ASCII))) { 
    for (String line = reader.readLine(); line != null; line = reader.readLine()) { 
    System.out.println(line); 
    } 
} catch (final IOException ex) { 
    ex.printStackTrace(); 
} 
+0

Глупые ошибки :). Tnx –

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

  • Нет связанных вопросов^_^