關一Socket獲得的InputStream,read方法最後一直阻塞的問題

今天在嘗試使用protobuf在服務端和android進行數據轉遞和解析時遇到一個小問題,這裏記錄一下。大概的場景是pc與android使用socket通訊,pc爲服務端,android向服務端發送請求後,服務端將protobuf對象返回給android端。android端獲得InputStream後轉換爲byte[]再轉換爲protobuf對象。出現的問題就是InputStream在轉換爲byte[]部是發生阻塞,不能成功。
java

socket client端在接收到服務端的InputStream後,要將其轉換爲byte[],一般使用的方法大體以下:android

public static byte[] toByteArray(InputStream input) throws IOException {

  ByteArrayOutputStream swapStream = new ByteArrayOutputStream();
        byte[] buff = new byte[1024];
        int rc = 0;
        while ((rc = input.read(buff, 0, 1024)) > 0) {
            swapStream.write(buff, 0, rc);
        }
        byte[] bytes = swapStream.toByteArray();
        return bytes; 
}



可是,若是一不注意,就會發如今input.read()讀到流的結尾後,線程一真阻塞在這裏,也就是一直在等着再有新數據讀。這是由於socket服務端的OutputStream並無關閉,因此這裏並不認爲流已經結束。這裏只要服務端輸出流在flush()以後正確關閉便可。web

相關文章
相關標籤/搜索