2015-03-02 2 views
1

Я использую этот код:BufferedReader.readLine() приостанавливает мое приложение?

while (true) { 
    sendData("hi"); 
    System.out.println("Data sent!"); 
    BufferedReader inFromServer; 
    try { 
     inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 
    } catch (IOException e1) { 
     inFromServer = null; 
     e1.printStackTrace(); 
    } 
    System.out.println("Recieved!"); //I see this de-bug message. 
    try { 
     modifiedSentence = inFromServer.readLine(); 
     System.out.println("FROM SERVER: " + modifiedSentence); //I do NOT see this de-bug message! 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

Он успешно отправляет данные на сервер - и сервер успешно отправляет данные обратно:

public void run() { 
    //handle the session using the socket (example) 
    try { 
     sendData("Hi"); 
     System.out.println("Data sent!"); //I see this de-bug message. 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

Однако по какой-то причине, приложение, кажется, остановиться на inFromServer.readLine(). Я вижу «Полученный!» de-bug, но не сообщение de-bug «FROM SERVER».

enter image description here

Там нет ошибок на всех. Кажется, он висит там.

Почему это висит, и как я могу это исправить?

+2

Одна проблема заключается в том, что вы не вырывались из 'в то время (правда)' петля – imtheman

+1

@imtheman «ОТ СЕРВЕРА» находится в цикл, это не проблема. –

+2

@ Jean-FrançoisSavard Правда, это не проблема *, но проблема * a *. – imtheman

ответ

3

Ну, это просто означает, что inFromServer не получает никакой линии.

Убедитесь, что вы на самом деле отправить строку,

Считывает строку текста. Линия считается завершенной любым строки ('\ n'), возвратом каретки ('\ r') или возвратом каретки , за которым следует сразу строка.

Посмотрите на метод readLine:

String readLine(boolean ignoreLF) throws IOException { 
    StringBuffer s = null; 
    int startChar; 

    synchronized (lock) { 
     ensureOpen(); 
     boolean omitLF = ignoreLF || skipLF; 

    bufferLoop: 
     for (;;) { 

      if (nextChar >= nChars) 
       fill(); 
      if (nextChar >= nChars) { /* EOF */ 
       if (s != null && s.length() > 0) 
        return s.toString(); 
       else 
        return null; 
      } 
      boolean eol = false; 
      char c = 0; 
      int i; 

      /* Skip a leftover '\n', if necessary */ 
      if (omitLF && (cb[nextChar] == '\n')) 
       nextChar++; 
      skipLF = false; 
      omitLF = false; 

     charLoop: 
      for (i = nextChar; i < nChars; i++) { 
       c = cb[i]; 
       if ((c == '\n') || (c == '\r')) { 
        eol = true; 
        break charLoop; 
       } 
      } 

      startChar = nextChar; 
      nextChar = i; 

      if (eol) { 
       String str; 
       if (s == null) { 
        str = new String(cb, startChar, i - startChar); 
       } else { 
        s.append(cb, startChar, i - startChar); 
        str = s.toString(); 
       } 
       nextChar++; 
       if (c == '\r') { 
        skipLF = true; 
       } 
       return str; 
      } 

      if (s == null) 
       s = new StringBuffer(defaultExpectedLineLength); 
      s.append(cb, startChar, i - startChar); 
     } 
    } 
} 

Обратите внимание, что это один получит логическое, но называть readLine просто не назвать этот с false прошло, если на Linux.

Обратите внимание на цикл for(;;), который представляет собой бесконечный цикл.

Попробуйте concatening «линии», отправленная с сервера

System.getProperty("line.separator"); 
+1

Возможно, вашему серверу нужно отправить обратно 'sendData (« Hi \ n »);' –

+0

Лучше использовать 'System.getProperty (« line.separator »);' see edit. –

+0

Добавление \ n в конце каждого сообщения отлично работает. Быстрый вопрос: \ n учитывается в методе .readLine()? Как и в случае, если я должен обработать строку, будет ли \ n считаться частью этого кода? – Joehot200