首页 > 代码库 > 关一Socket得到的InputStream,read方法最后一直阻塞的问题
关一Socket得到的InputStream,read方法最后一直阻塞的问题
今天在尝试使用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()之后正确关闭即可。
关一Socket得到的InputStream,read方法最后一直阻塞的问题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。