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读取数据不全相关推荐

  1. LibUsbDotNet2.2.29版本通过usb口,获取扫码盒子扫码数据,读取数据不全和不对

    LibUsbDotNet 通过usb口获取扫码盒子扫码数据,读取数据不全和不对. 以下是具体实现代码:在这里插入代码片 public void Open(int vid, int pid) { Usb ...

  2. java InputStream读取数据问题【转http://cuisuqiang.iteye.com/blog/1434416】

    首先请查看一下JavaAPI,可以看到InputStream读取流有三个方法,分别为read(),read(byte[] b),read(byte[] b, int off, int len).其中r ...

  3. 【转载】java InputStream读取数据问题

    原文链接:http://www.cnblogs.com/MyFavorite/archive/2010/10/19/1855758.html 1. 关于InputStream.read()      ...

  4. java InputStream读取数据问题【转】http://cuisuqiang.iteye.com/blog/1434416

    首先请查看一下JavaAPI,可以看到InputStream读取流有三个方法,分别为read(),read(byte[] b),read(byte[] b, int off, int len).其中r ...

  5. InputStream读取数据

    InputStream读取流有三个方法: read() read(byte[] b) read(byte[] b, int off, int len) 在从数据流里读取数据时,为图简单,经常用Inpu ...

  6. java获取inputstream_java InputStream读取数据问题

    1. 关于InputStream.read() 在从数据流里读取数据时,为图简单,经常用InputStream.read()方法.这个方法是从流里每次只读取读取一个字节,效率会非常低.     更好的 ...

  7. Request.InputStream 将数据作为XML数据发送

    将数据作为XML数据发送,例如: public voidPostXml(stringurl, stringxml) {     byte[] bytes = Encoding.UTF8.GetByte ...

  8. mfc从文件中读取数据_Java中Transient关键字,一点课堂(多岸学院)

    Java中Transient关键字 虽然自己最熟的是Java,但很多Java基础知识都不知道,比如transient关键字以前都没用到过,所以不知道它的作用是什么,今天做笔试题时发现有一题是关于这个的 ...

  9. android 从文件制定位置读取数据

    今天,简单讲讲android 如何从制定的位置读取文件. 之前,我写了使用FileInputStream使用read(byte[] b)读取文件的博客,每次调用read()时,FileInputStr ...

最新文章

  1. TermCriteria模板类
  2. python同步赋值原理,Python直接赋值及深浅拷贝原理详解
  3. Linux下文件的三个时间:ctime、mtime、atime的区别
  4. 浅谈Java网络编程之Socket (2)
  5. 线程和std::shared_ptr智能指针使用
  6. C语言int的字节数跟什么有关,C语言中int型字长和什么有关
  7. ionic cordova 热更新
  8. Java 3D期末复习第三章——Java 3D 基本图形功能
  9. node.js 将jade变为html
  10. 相关系数excel_如何用Excel计算自相关系数?
  11. [数学建模]马尔萨斯的人口模型及感性认识
  12. 【原创】高精度好题 Heaven Cow与God Bull
  13. 一文搞懂单向散列函数
  14. 还担心春节抢不到票,Github标星21K,这两款开源项目值得推荐
  15. 微信小程序搜索框组件之SearchBar
  16. 【自动控制系统的基本原理】
  17. 力扣第八题 myatoi
  18. 【推荐架构day8】美团推荐算法的实践篇
  19. Iterated Logarithm Function 多重对数函数
  20. java里怎么使字居中显示,JAVA怎样使Label中的文字居中对齐!

热门文章

  1. Spring Boot——分布式
  2. CSS预处理器stylus - 安装与使用
  3. 全球及中国微孔手术纸质胶带行业研究及十四五规划分析报告
  4. Go 每日一库之 resty
  5. vscode安装使用(含安装包)、更改语言、更换主题和背景、设置模板、更改字体大小
  6. oracle分区表加索引,Oracle 分区表上的索引
  7. 2022-2028年全球与中国LED引线框架行业发展趋势及投资战略分析
  8. asp.net mvc 中Html.ValidationSummary显示html
  9. k8s操作自定义资源
  10. 编译原理学习笔记:CFG的分析树(句型的短语、二义性文法、二义性文法的判定)