2015-02-10 3 views
-1

Мой клиент всегда блокирует br.readLine(). Я попытался добавить «\ n», но это не решило проблему. Также char Array блокирует, когда я использую только read вместо readLine.Ячейки сокетов Java TCP readLine

Кто может мне помочь?

КЛИЕНТ

 /** Benutzereingabe einlesen **/ 
     BufferedReader brEingabe = new BufferedReader(new InputStreamReader(System.in)); 
     String send = brEingabe.readLine(); 

     Socket socket = new Socket(host, port); 

     BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     PrintWriter pr = new PrintWriter(socket.getOutputStream()); 
     pr.println(send); 
     pr.flush(); 

     System.out.println(br.readLine()); // is blocking  

     socket.close(); 
    } 
    catch(Exception e){ 
     e.printStackTrace(); 
    } 
} 

SERVER

 ServerSocket serverSocket = new ServerSocket(port); 
     while (true) { 
      //ServerSocket serverSocket = new ServerSocket(port); 
      Socket socket = serverSocket.accept(); // blockiert bis Anfrage kommt 

      BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); 

      String zeile; 
      while ((zeile = br.readLine()) != null) { 
       System.out.println(zeile); 
       if (zeile.isEmpty()) break; 
      } 

      PrintWriter pw = new PrintWriter(socket.getOutputStream()); 
      pw.write("Hallo\n"); 
      pw.flush(); 

      pw.close(); 
      socket.close(); 
     } 
    } 
    catch (IOException e) { 
     e.printStackTrace(); 
    } 

ответ

2

Ваш код, как написано это делает:

  • Клиент пишет одну строку, а затем пытается прочитать один.

  • Сервер считывает несколько строк, пока не получит пустую строку или конец потока. Затем он пишет строку.

Проблема заключается в том, что сервер ожидает клиент, чтобы сделать то, что он не собирается делать:

  • клиент не будет посылать пустые строки (если он не прочитал одну от стандартного ввода),

  • клиент не будет закрывать поток ... пока он не получит ответ от сервера.

Следовательно, клиент ждет сервер, и сервер ждет клиента. Тупик.


Существуют различные способы решения этой проблемы. Один простой способ будет изменить (в клиенте)

println(send); 

к этому

println(send); println(); 

Однако, одна проблема в том, что ваш «протокол» не справляется с делом хочет отправить пустая строка в качестве данных. Это потому, что вы неявно используете пустую строку (от клиента), чтобы означать «сообщение завершено».

+0

Хорошо, исправлена ​​проблема, но как сервер может читать несколько строк? – Max

+0

Просмотреть мое обновление ... –

+0

Я изменил println (отправить) на pr.println (отправить + "\ n"); и теперь все в порядке. zeile.isEmpty() проверяет, есть ли «\ n» в конце? Я действительно не понимаю, как это работает – Max