关一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()之后正确关闭即可。

时间: 2024-10-05 11:36:51

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

(蓝牙)网络编程中,使用InputStream read方法读取数据阻塞的解决方法

问题如题,这个问题困扰了我好几天,今天终于解决了,感谢[1]. 首先,我要做的是android手机和电脑进行蓝牙通信,android发一句话,电脑端程序至少就要做到接受到那句话.android端发送信息的代码如下: try { Log.i("Test", "begin saying hello world"); String test = "Hello world, I am james"; outputStream.write(test.get

socket&socket实现ftp的get方法、socketserver

首先了解socket工作原理,client-server模式 1.socket客户端: 2.socket类型 3.socket数据流 4.实验 (1)写一个client 服务端启动监听ip和端口 admindeMacBook-Air-62:~ admin$ nc -l 1234 客户端连接服务端,发数据,关闭socket pycharm中添加一个socket_client.py并之行: import socket HOST = '127.0.0.1' PORT = 1234 s = socket

[Android Pro] 关于inputStream.available()方法获取文件的总大小

reference to :http://hold-on.iteye.com/blog/1017449 如果用inputStream对象的available()方法获取流中可读取的数据大小,通常我们调用这个函数是在下载文件或者对文件进行其他处理时获取文件的总大小. 以前在我们初学File和inputStream和outputStream时,有需要将文件从一个文件夹复制到另一个文件夹中,这时候我们用的就是inputStream.available()来获取文件的总大小,而且屡试不爽. 但是当我们要

php中使用Curl、socket、file_get_contents三种方法POST提交数据

抓取远程内容,之前一直都在用file_get_content函数,其实早就知道有curl这么一个好东西的存在,但是看了一眼后感觉使用颇有些复杂,没有file_get_content那么简单,再就是需求也不大,所以没有学习使用curl. 直到最近,要做一个网页小偷程序的时候才发现file_get_content已经完全不能满足需求了.我觉得,在读取远程内容的时候,file_get_content除了使用比curl便捷以外,其他都没有curl好. php中curl和file_get_content的

Linux socket 类封装 (面向对象方法)

1 /* 2 * socketfactory.h 3 * 4 * Created on: 2014-7-19 5 * Author: root 6 */ 7 8 #ifndef SOCKETFACTORY_H_ 9 #define SOCKETFACTORY_H_ 10 #include<sys/types.h> 11 12 /* 13 * 在网路编程中, 一般分为服务端和客户端,两者的行为有相似之处,也有非常多的不同.在linux中对socket程序设计 14 * 仅提供了socket(),

老项目采用tomcat出现异常:Connection reset by peer: socket write error 异常解决方法

项目一段时间就出现异常,导致无法登陆系统,数据库无法连接上 异常信息如下: java.sql.SQLException: Io 异常: Connection reset by peer: socket write error at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134) at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179) a

python socket.error: [Errno 10054] 解决方法

我用的是python2.7   我搜网上10054错误解决方法的时候发现,大部分文章都是以python3为基础的,对于python2不适用. python socket.error: [Errno 10054]  远程主机强迫关闭了一个现有的连接. 原因:服务器发现你的爬虫行为了,所有强制断开链接了 解决办法:  服务器知道你是爬虫,加headers, 模拟浏览器agent:head中有一个user-agent每次都换不同的模拟代理 #coding:utf-8 import urllib2 ur

(判断url文件大小)关于inputStream.available()方法获取下载文件的总大小

转自:http://hold-on.iteye.com/blog/1017449 Java代码   如果用inputStream对象的available()方法获取流中可读取的数据大小,通常我们调用这个函数是在下载文件或者对文件进行其他处理时获取文件的总大小. 以前在我们初学File和inputStream和outputStream时,有需要将文件从一个文件夹复制到另一个文件夹中,这时候我们用的就是inputStream.available()来获取文件的总大小,而且屡试不爽. 但是当我们要从网

Tomcat 的 socket bind failed的解决方法

1.socket bind failed的原因一般是Tomcat端口被占用,一般解除端口占用就行了 解决步骤: 1.win+R打开运行,输入cmd,进入dos界面: 2.输入netstat -ano |findstr 8080  查看占用端口8080,每个人的端口号可能占用的不同,要根据实际情况来看 通过 taskkill /f /pid 4228 杀死进程为4228的应用: