今天在尝试使用protobuf在服务端和android进行数据转递和解析时遇到一个小问题,这里记录一下。大概的场景是pc与android使用socket通信,pc为服务端,android向服务端发送请求后,服务端将protobuf对象返回给android端。android端得到InputStream后转换为byte[]再转换为protobuf对象。出现的问题就是InputStream在转换为byte[]部是发生阻塞,不能成功。
socket client端在接收到服务端的InputStream后,要将其转换为byte[],通常使用的方法大致如下:
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()之后正确关闭即可。
来源:oschina
链接:https://my.oschina.net/u/2263956/blog/343582