大家好:
今天我想介绍一下socket中字节流的读取方式,避免在socket读取过程中发生的断包问题。
1.设计字节发送的方式
在字节流的读写过程中,需要先发送一个代表发送内容长度的字节,然后再发送内容,在接收端先接受发送端发送的内容长度,再根据长度来读取相应的内容。
2.构建字节流的读写类
BufferedInputStream in = new BufferedInputStream(socket.getInputStream()); BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream());
3.发送端的发送方式
out.write(NumberUtil.intToByte(data.length));// NumberUtil类是把int和字节转换的类,在附件中附送 out.write(data); out.flush();
4.接收端的接收方式
protected byte[] read() throws IOException {
byte[] buf = null;
// 读取长度
int contentLength = readInt();
// 如果消息的长度不够
if (contentLength > in.available()) {
buf = BytesUtil.readBytes(in, contentLength);//BytesUtil类为读取指定长度字节的一个共通类,在附件中附送,也就是说当前缓冲流的可读字节长度<真实字节长度,那么我们需要一直读,直到读取了我们需要的长度
} else {
buf = new byte[contentLength];
in.read(buf, 0, contentLength);
}
return buf;
}
private int readInt() throws IOException {
// 四个字节大小
byte[] tmpByte = new byte[4];
// 读取四个字节判断消息长度
in.read(tmpByte, 0, 4);
// 将byte转为int
return NumberUtil.byteToInt(tmpByte);
}
5.介绍readBytes方法
/** * 读取输入流中指定字节的长度 * * @param in 输入流 * @param length 指定长度 * @return 指定长度的字节数组 */ public static byte[] readBytes(InputStream in, long length) throws IOException { ByteArrayOutputStream bo = new ByteArrayOutputStream();// 建立字节流 byte[] buffer = new byte[1024];//1024长度 int read = 0; while (read < length) {// 循环将需要读取内容写入到bo中 int cur = in.read(buffer, 0, (int) Math.min(1024, length - read)); if (cur < 0) {//直到读到的返回标记为-1,表示读到流的结尾 break; } read += cur;//每次读取的长度累加 bo.write(buffer, 0, cur); } return bo.toByteArray();//返回内容 }
总结:基于TCP/IP的传输方式中,TCP是不会丢包的,如果在你的程序中发生了字节的丢失,请检查你的socket输入字节流的读取方式,一定要注意以上代码中的红色标出的内容。
感谢你的阅读,对自己负责、对父母感恩!
相关推荐
Java字节流数据逐行读取(readLine)
javaIO字节流读取文件方式总结共4页.pdf.zip
java 读取字节流的例子,非常好。本例用System.in.read(buffer)从键盘输入一行字符,存储在缓冲区buffer中,再以FileOutStream的write(buffer)方法,将buffer中内容写入文件WriteFile.txt中,程序如下(本例程序放在...
Java实现字节流与图片的转化
主要给大家介绍了关于Java中字节流文件读取的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用java具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
主要给大家介绍了关于Java中字节流文件读取的相关资料,本文属于之前文章的延长篇,有需要的朋友可以先看看上一篇文章,相信会对大家的学习或者工作具有一定的参考学习价值,下面随着小编来一起学习学习吧
java读取文件大全 写入字节流 读取字节流 在实际运用中相当的广泛 大家共享下资料
1.DataInputStream,DataOutputStream 从Stream里读取基本类型的数据 BufferedReader,BufferedWriter 从Reader/Writer里读取基本类型的数据 2.BufferedInputStream,BufferedOutputStream 封装了从缓冲区读写指定...
主要为大家详细介绍了Java socket字节流传输示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
使用RandomAccessFile 流读取hello.txt文件舍弃其前4行 和 后 6行的内容,并将其他行的内容倒置读出。程序尽量做到通用性,可以读取任何一个文件。 可以自己随便创建一个hello.txt文件作为测试用(其中可能包含中文...
javaIO读取实现 =初学者看看了解 希望有所帮助
用poi读取excel多个sheet内容,用流的方式判断excel的版本,2003,还是2007版本,并附带所需jar包,文件下载后解压,直接导入eclipse中即可使用
JavaIO实例,包括:字节流、字符流、缓冲流、转换流
java操作excel数据的导入导出,java流的读取
不会实现字节读取文件信息的童鞋可以看看这个代码,写的非常好。。
c++,java,php,c# 的网络字节流读写文件,文件的所有读写方式都采用的是大端,只有php有大端和小端2种选择。
当有需求,需要把当天的报表文件发送给指定邮箱又不小生成多余的...实现过程是先将数据库里的数据,导出excel文件输出流中(注:不是直接生成文件),发送邮件时附件内容直接从前面excel文件输出流中获取,然后发送邮件
对于非文本文件(.jpg,.mp3,.mp4,.avi,.doc,.ppt,...),使用字节流处理 2.数据的流向:输入流、输出流 3.流的角色:节点流、处理流 节点流:直接从数据源或目的地读写数据 处理流:不直接连接到数据源或...
一、 流的分类 • 按数据流动方向 ...– 字节流:用于处理字节数据。 – 字符流:用于处理Unicode字符数据。 • 按照流所处理的源 – 节点流:从/向一个特定的IO设备读/写数据的流。(低级流) – 处理