2015-10-22 59 views
0

以下代碼應檢測到沒有更多字節需要讀取。然而,它只是掛起,直到客戶端連接關閉。如何檢測socket的InputStream結束?

服務器

 //... 

     StringBuilder builder = new StringBuilder(128); 
     byte[] buffer = new byte[1024]; 
     int length = 0; 

     while ((length = socket.getInputStream().read(buffer)) != -1) { 
      System.out.println(length); 
      builder.append(new String(buffer)); 
      System.out.println(builder.toString()); 
     } 

客戶

//... 

    OutputStream stream = clientSocket.getOutputStream(); 
    stream.write("LIST".getBytes()); 
    stream.flush(); 

的API,並在這樣的問題以前的答案州然而,這是-1應該意味着沒有要讀取的字符,循環寫入:

  • LIST

  • 掛起20秒,直到客戶端關閉套接字並且拾取-1終止循環。

我該如何正確檢測到流中沒有更多字符?

此後連接應該保持打開狀態。

我可以提前發送字節數或特殊字符,但可以檢測到即使連接仍處於活動狀態,也無法再讀取任何內容。

+0

我試着用0和它掛起不管。在Java中的 – John

+1

@vlp -1。 InputStream.read()不能返回零,除非你提供一個零長度緩衝區或一個零計數。 – EJP

回答

4

的API,並在這樣的問題以前的答案指出,-1應該意味着沒有要讀取

我不能什麼一些uncited答案可能會說評論人物,但API文檔說沒有這樣的事情。它說-1在流結束時返回。當對等體關閉連接或關閉輸出時,而不是之前,會發生套接字流結束。

-1不是消息指示符的結尾。

+0

所以沒有這樣的事情來檢測沒有字符被讀取沒有阻塞或自定義協議? – John

+0

@John這是正確的。如果你想要消息,你必須自己實現它們:行,長字前綴,XML,XDR等自描述協議... – EJP

+1

'available()'(我只是好奇)怎麼樣? – vlp