2015-03-02 73 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()方法。我看到「收到!」刪除錯誤消息,但不包含「從服務器」刪除錯誤消息。

enter image description here

有沒有錯誤可言。它似乎只是掛在那裏。

爲什麼它掛着,我該如何解決?

+2

一個問題發送的「行」是你不打破的'而(真)'循環 – imtheman 2015-03-02 16:43:59

+1

@imtheman「從服務器」是在循環,這不是問題。 – 2015-03-02 16:49:11

+2

@ Jean-FrançoisSavard誠然,這不是*問題,但它是一個*問題。 – imtheman 2015-03-02 16:50:32

回答

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」);' – 2015-03-02 16:53:56

+0

最好使用'System.getProperty(「line.separator」);'參見編輯。 – 2015-03-02 16:55:31

+0

在每封郵件末尾添加\ n已完美工作。 快速的問題,\ n計算在.readLine()方法中?如果我要處理字符串,\ n在我的代碼中是否會被視爲它的一部分? – Joehot200 2015-03-02 22:56:55