文档章节

关一Socket得到的InputStream,read方法最后一直阻塞的问题

jimmywu911
 jimmywu911
发布于 2014/11/12 15:52
字数 296
阅读 10853
收藏 4

今天在尝试使用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()之后正确关闭即可。


© 著作权归作者所有

共有 人打赏支持
jimmywu911
粉丝 5
博文 8
码字总数 8529
作品 0
昌平
高级程序员
私信 提问
加载中

评论(2)

push_back0
push_back0
问题已解决,非常感谢83
雷毅
雷毅
不错。以前遇到过同样问题
Java Socket Timeout总结

Socket timeout Java socket有如下两种timeout: 建立连接timeout,暂时就叫 connect timeout; 读取数据timeout,暂时就叫so timeout。 1.1 建立连接connect timeout 当不设置该参数时,指客...

囚兔
2016/07/20
2.2K
0
socket inputstream read bug

我们在写输入输出流中经常是以循环读取到-1作为结束符。 这个在文件的读写中,是没有问题的,很显然文件有结束符。 这个在socket通讯中,是有问题的,socket.getInputStream().read(buffer...

mingxun
2014/06/16
0
0
Android上的蓝牙通信功能的开发:BluetoothChat例程分析

1. 概述 Bluetooth 是几乎现在每部手机标准配备的功能,多用于耳机 mic 等设备与手机的连接,除此之外,还可以多部手机之间建立 bluetooth 通信,本文就通过 SDK 中带的一个聊天室的例程,来...

长平狐
2012/08/14
689
0
Android上的蓝牙通信功能的开发:BluetoothChat例程分析

1. 概述 Bluetooth 是几乎现在每部手机标准配备的功能,多用于耳机 mic 等设备与手机的连接,除此之外,还可以多部手机之间建立 bluetooth 通信,本文就通过 SDK 中带的一个聊天室的例程,来...

长平狐
2012/08/21
313
0
Android上的蓝牙通信功能的开发:BluetoothChat例程分析

1. 概述 Bluetooth 是几乎现在每部手机标准配备的功能,多用于耳机 mic 等设备与手机的连接,除此之外,还可以多部手机之间建立 bluetooth 通信,本文就通过 SDK 中带的一个聊天室的例程,来...

长平狐
2012/08/09
455
0

没有更多内容

加载失败,请刷新页面

加载更多

剖析Elasticsearch的IndexSorting:一种查询性能优化利器

摘要: 前言 前两周写过一篇《基于Lucene查询原理分析Elasticsearch的性能》,在最后留了一个彩蛋,说下一篇会介绍一种可以极大的优化查询性能的技术。本文就来介绍这种技术——IndexSortin...

阿里云官方博客
18分钟前
0
0
Go 使用channel控制并发

前言 channel一般用于协程之间的通信,channel也可以用于并发控制。比如主协程启动N个子协程,主协程等待所有子协程退出后再继续后续流程,这种场景下channel也可轻易实现。 场景示例 总结 ...

恋恋美食
43分钟前
2
0
斐波那契堆的理解,节点mark属性和势函数

斐波那契堆 看了好多博客,都是照搬算法导论的内容,没有自己的理解,比如为什么有mark属性,势函数的作用,以及为什么叫斐波那契堆,下面说说鄙人的理解。 势函数 势函数是根节点个数加上2...

杨喆
48分钟前
6
0
NIO源码详解

阻塞io和无阻塞io: 阻塞io是指jdk1.4之前版本面向流的io,服务端需要对每个请求建立一堆线程等待请求,而客户端发送请求后,先咨询服务端是否有线程相应,如果没有则会一直等待或者遭到拒 ...

沉稳2018
53分钟前
1
0
如何把已经提交的commit, 从一个分支放到另一个分支

在本地master提交了一个commit(8d85d4bca680a5dbcc3e5cfb3096d18cd510cc9f),如何提交的test_2分之上? git checkout test_2git cherry-pick 8d85d4bca680a5dbcc3e5cfb3096d18cd510cc9f......

stephen_wu
56分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部