文档章节

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

jimmywu911
 jimmywu911
发布于 2014/11/12 15:52
字数 296
阅读 10934
收藏 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
Java Socket超时浅析

套接字或插座(socket)是一种软件形式的抽象,用于表达两台机器间一个连接的“终端”。针对一个特定的连接,每台机器上都有一个“套接字”,可以想象它们之间有一条虚拟的“线缆”。JAVA 有两...

xtof
01/14
0
0
java InputStream读取数据问题

转载地址:点击打开链接 首先请查看一下JavaAPI,可以看到InputStream读取流有三个方法,分别为read(),read(byte[] b),read(byte[] b, int off, int len)。其中read()方法是一次读取一个字节...

lwang_IT
2017/12/24
0
0
java.net.SocketException: socket closed

在使用socket编程的时候,发现当使用完getInputStream方法后,再获取OutputStream就会报 java.net.SocketException: socket closed错误 看到JAVA api中写到 java.net.Socket.getInputStream...

jiangmitiao
2015/08/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

操作数据库表

/* DML:数据库操作语言 主要对表中的数据库进行 增删改 ****增:插入一条记录 insert into 表名 (列名1,列名2..) values (值1,值2..) 注意: 1.列名可以在表中选择一列或者几列 2.后面的值 必须...

stars永恒
2分钟前
0
0
你真的了解 volatile 关键字吗?

volatile关键字经常在并发编程中使用,其特性是保证可见性以及有序性,但是关于volatile的使用仍然要小心,这需要明白volatile关键字的特性及实现的原理,这也是本篇文章的主要内容。 一、J...

Henrykin
3分钟前
0
0
条码插件TBarCode Office系列教程二(Word Add-In篇)

TBarCode Office是一款适用于Microsoft Word 2007、2010和2013的条码插件,通过此插件可以轻松的在您的文档中嵌入代码。此系列教程旨在介绍TBarCode Office的常见问题及解答,帮助大家学习使...

ymy_666666
3分钟前
0
0
折腾Java设计模式之命令模式

博客原文地址 折腾Java设计模式之命令模式 命令模式 wiki上的描述 Encapsulate a request as an object, thereby allowing for the parameterization of clients with different requests, ......

大萌小路
4分钟前
0
0
微服务架构:基于微服务和Docker容器技术的PaaS云平台架构设计

基于微服务架构和Docker容器技术的PaaS云平台建设目标是给我们的开发人员提供一套服务快速开发、部署、运维管理、持续开发持续集成的流程。平台提供基础设施、中间件、数据服务、云服务器等资...

编程SHA
5分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部