今天在嘗試使用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