inputstream读取数据不全
TCP通讯使用定长报文。
格式:
请求 :6byte(表示后续报文长度len)+ byte[len]
响应: 6byte(表示后续报文长度len)+ byte[len]
从响应inputstream里按长度头里收到的len继续接收数据,发现有接收不全的情况。
通讯程序大概这样:
Socket socket = null;
InputStream inputStream = null;
OutputStream outputStream = null;
byte[] data = {};//要发送的数据
try {//创建Socket对象socket=new Socket(host,port);//根据输入输出流和服务端连接outputStream=socket.getOutputStream();//获取一个输出流,向服务端发送信息//补充长度头为6位字符串String lenString = PadLen(data.length,6);//发送长度头outputStream.write(lenString.getBytes());//发送数据outputStream.write(data);outputStream.flush();socket.shutdownOutput();//关闭输出流//获取一个输入流,接收服务端的信息inputStream=socket.getInputStream();//接收长度头byte[] len = new byte[6];inputStream.read(len);//按长度头数据接收实际数据int bodylen = Integer.parseInt(new String(len));byte[] reqData = new byte[bodylen];/**!!!就是这一步有问题,根据头指定长度继续接收,发现接收不全!!!*/int readLen =inputStream.read(reqData);//关闭相对应的资源inputStream.close();outputStream.close();socket.close();
} catch (Exception e) {logger.error("通讯异常",e);
}
就是按响应长度头接收实际数据时,一般数据长度每问题,当实际长度比较大,超过1万字节,实际在按长度接收,接收到长度只有6000多字节。不知为什么。百度说有TCP分包发送啥的也不懂。
最后解决方法,直接使用common-io包里的工具方法,处理流。不按长度接收了。
byte[] recvData = IOUtils.toByteArray(inputStream);
IOUtils.toByteArray方法的处理方式大致这样(2.6版本源码)
InputStream input;
//新建一个输出流
ByteArrayOutputStream output = new ByteArrayOutputStream();
/**
* copy(input, output);
将input输入流中数据复制到构造的输出流中
*/
long count = 0;
int n;
byte[] buffer = new byte[4096];
//循环读取到buffer
while (-1 != (n = input.read(buffer))) {output.write(buffer, 0, n);
}
//转换成byte array
return output.toByteArray();
inputstream读取数据不全相关推荐
- LibUsbDotNet2.2.29版本通过usb口,获取扫码盒子扫码数据,读取数据不全和不对
LibUsbDotNet 通过usb口获取扫码盒子扫码数据,读取数据不全和不对. 以下是具体实现代码:在这里插入代码片 public void Open(int vid, int pid) { Usb ...
- java InputStream读取数据问题【转http://cuisuqiang.iteye.com/blog/1434416】
首先请查看一下JavaAPI,可以看到InputStream读取流有三个方法,分别为read(),read(byte[] b),read(byte[] b, int off, int len).其中r ...
- 【转载】java InputStream读取数据问题
原文链接:http://www.cnblogs.com/MyFavorite/archive/2010/10/19/1855758.html 1. 关于InputStream.read() ...
- java InputStream读取数据问题【转】http://cuisuqiang.iteye.com/blog/1434416
首先请查看一下JavaAPI,可以看到InputStream读取流有三个方法,分别为read(),read(byte[] b),read(byte[] b, int off, int len).其中r ...
- InputStream读取数据
InputStream读取流有三个方法: read() read(byte[] b) read(byte[] b, int off, int len) 在从数据流里读取数据时,为图简单,经常用Inpu ...
- java获取inputstream_java InputStream读取数据问题
1. 关于InputStream.read() 在从数据流里读取数据时,为图简单,经常用InputStream.read()方法.这个方法是从流里每次只读取读取一个字节,效率会非常低. 更好的 ...
- Request.InputStream 将数据作为XML数据发送
将数据作为XML数据发送,例如: public voidPostXml(stringurl, stringxml) { byte[] bytes = Encoding.UTF8.GetByte ...
- mfc从文件中读取数据_Java中Transient关键字,一点课堂(多岸学院)
Java中Transient关键字 虽然自己最熟的是Java,但很多Java基础知识都不知道,比如transient关键字以前都没用到过,所以不知道它的作用是什么,今天做笔试题时发现有一题是关于这个的 ...
- android 从文件制定位置读取数据
今天,简单讲讲android 如何从制定的位置读取文件. 之前,我写了使用FileInputStream使用read(byte[] b)读取文件的博客,每次调用read()时,FileInputStr ...
最新文章
- TermCriteria模板类
- python同步赋值原理,Python直接赋值及深浅拷贝原理详解
- Linux下文件的三个时间:ctime、mtime、atime的区别
- 浅谈Java网络编程之Socket (2)
- 线程和std::shared_ptr智能指针使用
- C语言int的字节数跟什么有关,C语言中int型字长和什么有关
- ionic cordova 热更新
- Java 3D期末复习第三章——Java 3D 基本图形功能
- node.js 将jade变为html
- 相关系数excel_如何用Excel计算自相关系数?
- [数学建模]马尔萨斯的人口模型及感性认识
- 【原创】高精度好题 Heaven Cow与God Bull
- 一文搞懂单向散列函数
- 还担心春节抢不到票,Github标星21K,这两款开源项目值得推荐
- 微信小程序搜索框组件之SearchBar
- 【自动控制系统的基本原理】
- 力扣第八题 myatoi
- 【推荐架构day8】美团推荐算法的实践篇
- Iterated Logarithm Function 多重对数函数
- java里怎么使字居中显示,JAVA怎样使Label中的文字居中对齐!
热门文章
- Spring Boot——分布式
- CSS预处理器stylus - 安装与使用
- 全球及中国微孔手术纸质胶带行业研究及十四五规划分析报告
- Go 每日一库之 resty
- vscode安装使用(含安装包)、更改语言、更换主题和背景、设置模板、更改字体大小
- oracle分区表加索引,Oracle 分区表上的索引
- 2022-2028年全球与中国LED引线框架行业发展趋势及投资战略分析
- asp.net mvc 中Html.ValidationSummary显示html
- k8s操作自定义资源
- 编译原理学习笔记:CFG的分析树(句型的短语、二义性文法、二义性文法的判定)