0

年底這是一個代碼片段,其中存在類似的情況:套接字的InputStream不返回-1在流

public static byte[] copyLargeExt(InputStream input) throws IOException { 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     byte[] buffer = new byte[1024*8]; 
     int n = 0; 
     while(-1 != (n = input.read(buffer))) { 
      baos.write(buffer, 0, n); 
     // i just append this pattern ({###END###}) to force the break 
      /*if(baos.toString(UTF8.name()).endsWith("{###END###}")) { 
       break; 
      }*/ 
     } 
     return baos.toByteArray(); 
    } 

有人能幫助我嗎?

+1

那麼,只是永遠循環?你的輸入流來自哪裏? –

+0

它只是不會永久循環,但它不會返回任何內容。輸入流來自Google(Postman) –

+0

當套接字關閉時,流的末端將到達。誰關閉了套接字? – NPE

回答

2

問題中的代碼讀取到套接字流的末尾。如果方法被阻塞並且在讀取調用中,那麼這隻能意味着另一端尚未關閉其相應的輸出流。

你有兩個選擇:

  • 變化的另一端關閉其的OutputStream因此,該代碼會看到一個EOF。

  • 更改「協議」,以便此代碼知道需要多少字節的數據...並精確讀取該字節數。

0

在Java中。
如果服務器只有Socket.close()沒有OutputStream.close()首先,客戶的InputStream.read()不會返回-1
而是,客戶的InputStream.read()將阻塞,直到超時。 因此,服務器上的最佳做法是:

OutputStream.close(); 
InputStream.close(); 
Socket.close(); 
相關問題