文档章节

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

jimmywu911
 jimmywu911
发布于 2014/11/12 15:52
字数 296
阅读 10367
收藏 4
点赞 0
评论 2

今天在尝试使用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 ,多客户端同时与服务端不停的交换数据

今天终于有时间来实践一下Java socket的使用方法了,需要注意几个问题: (1)、使用socket.getInputStream 读取数据时,该方法是阻塞方法,即如果管道流中没有数据时,使用inputStream.read(...

jiachcheng ⋅ 2013/01/13 ⋅ 2

Java Socket Timeout总结

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

囚兔 ⋅ 2016/07/20 ⋅ 0

socket inputstream read bug

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

mingxun ⋅ 2014/06/16 ⋅ 0

Android开发 socket

这几天完全被socket 卡住了, 主要原因就是就ip,Socket通信主要有俩种,1,TCP,2,UDP 一,什么时候SOCKET通信: 你经常听到人们谈论着 “socket”,或许你还不知道它的确切含义。现在让我...

DURONG ⋅ 2012/05/04 ⋅ 4

Android上的蓝牙通信功能的开发:BluetoothChat例程分析

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

长平狐 ⋅ 2012/08/14 ⋅ 0

Android上的蓝牙通信功能的开发:BluetoothChat例程分析

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

长平狐 ⋅ 2012/08/21 ⋅ 0

Android上的蓝牙通信功能的开发:BluetoothChat例程分析

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

长平狐 ⋅ 2012/08/09 ⋅ 0

Okio精简高效的IO库

本节主要讲讲Okhttp底层使用的IO库--Okio,Okio同样是Square公司推出的增强型IO处理库,旨在增强原生Java IO流的处理,以更加简便,高效的方式处理IO流操作。接下来我会从以下方面来分析它。...

Ihesong ⋅ 2017/11/28 ⋅ 0

Java阻塞IO与非阻塞IO

IO:IO 是主存和外部设备 ( 硬盘、终端和网络等 ) 拷贝数据的过程。 IO 是操作系统的底层功能实现,底层通过 I/O 指令进行完成。 阻塞与非阻塞:一辆从 A 开往 B 的公共汽车上,路上有很多点可...

那位先生 ⋅ 2015/01/07 ⋅ 3

深入分析 Java I/O 的工作机制(一)

简介: I/O 问题可以说是当今互联网 Web 应用中所面临的主要问题之一,因为当前在这个海量数据时代,数据在网络中随处流动。这个流动的过程中都涉及到 I/O 问题,可以说大部分 Web 应用系统的...

Mysoft ⋅ 2015/09/24 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

IOS-UI UI初步代码布局添加事件

ISO开发界面,UI是必须学习的一部分,其实很早之前想学来了,一直没有沉下心来学习。看到IOS的代码风格和布局就别扭的不行,跟java代码和android布局比较显得不是那么方便,所以一直到现在。...

京一 ⋅ 34分钟前 ⋅ 0

浅谈OpenDaylight的二次开发

OpenDaylight作为一款开源SDN网络控制器,依托于强大的社区支持以及功能特性,成为了目前主流的SDN网络控制器开发平台。在比较稳定的OpenDaylight Helium版本中,已经为开发者提供了大量的网...

wangxuwei ⋅ 43分钟前 ⋅ 0

API 开发中可选择传递 token 接口遇到的一个坑

在做 API 开发时,不可避免会涉及到登录验证,我使用的是jwt-auth 在登录中会经常遇到一个token过期的问题,在config/jwt.php默认设置中,这个过期时间是一个小时,不过为了安全也可以设置更...

等月人 ⋅ 44分钟前 ⋅ 0

Java NIO之文件处理

程序要操作本地操作系统的一个文件,可以分为以下三个部分: 对文件位置的操作 对文件的操作 对文件内容的操作 其中,对文件内容的操作在 Java NIO之Channel 中已经有了介绍,通过FileChann...

士别三日 ⋅ 49分钟前 ⋅ 0

Maven的pom.xml配置文件详解

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.......

小海bug ⋅ 今天 ⋅ 0

解决httpclient超时设置不生效的问题

最近公司有项目需要通过http调用第三方服务,且第三方服务偶有超时,故需要设置一定的超时时间防止不响应的情况出现。 初始设置如下: [java] view plain copy //超时设置 RequestConfig re...

Mr_Tea伯奕 ⋅ 今天 ⋅ 0

过滤器Filter和拦截器HandlerInterceptor

过滤器 依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要...

hutaishi ⋅ 今天 ⋅ 0

Redis入门详解(转)

Redis入门详解 Redis简介 Redis安装 Redis配置 Redis数据类型 Redis功能 持久化 主从复制 事务支持 发布订阅 管道 虚拟内存 Redis性能 Redis部署 Redis应用场景 Redis总结 Redis简介: Redi...

xiaoyaoyoufang ⋅ 今天 ⋅ 0

说说javascript中的那些专业名词

DOM(Document Object Model) 文档对象模型 BOM(Browser Object Model) 浏览器对象模型 ECMA(European Computer Manufacturer's Association) 欧洲计算机制造商协会 W3C(World Wide Web Conso......

hang1989 ⋅ 今天 ⋅ 0

Bootstrap Wizard 多步表单控件

废话 有一块需求是 有多步表单 点击下一步时触发验证一个范围内的表单,点击上一步或取消,清空表单并返回第一步,点击最后一步提交整个表单的 就找到了这个插件,本来自己写了一个原生的 fo...

无极之岚 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部