大家好:
今天我想介绍一下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输入字节流的读取方式,一定要注意以上代码中的红色标出的内容。
感谢你的阅读,对自己负责、对父母感恩!
相关推荐
以下是一个使用`BufferedReader`和`InputStreamReader`结合字节流读取文本文件逐行的示例: ```java import java.io.BufferedReader; import java.io.FileInputStream; import java.io.InputStreamReader; public ...
在Java中,字节流是一种处理二进制数据的基本方式。它通过一系列类来实现数据的读取和写入功能,这些类主要继承自`InputStream`和`OutputStream`两个抽象类。字节流非常适合处理非文本文件(如图片、音频等)以及...
Java中的字节流文件读取教程(一) 本篇文章主要介绍了Java中字节流文件读取的相关知识,通过示例代码详细介绍了字节流文件读取的原理和使用场景。下面是相关知识点的总结: 1. Java中的IO流设计 Java的IO流设计...
本资料“javaIO字节流读取文件方式总结共4页.pdf”详细介绍了Java字节流在读取文件时的各种方法和应用场景。本文将深入探讨这些知识点。 首先,Java中的字节流分为输入流(InputStream)和输出流(OutputStream)。...
在Java编程中,字节流(Byte Stream)是处理数据的基本方式,特别是在处理二进制数据,如图片、音频或视频文件时。本教程将详细讲解如何使用Java实现字节流来转换和处理图片。 首先,我们需要理解字节流的概念。在...
Java字节流是一种用于处理字节数据的流处理机制,在Java中,字节流不包含边界数据的连续流,字节流是由字节组成的,Java里字符由两个字节组成。字节流是最基本的,它是按字节来处理二进制数据。 字节流基类有:字节...
Java中的`InputStream`和`OutputStream`是所有字节流的基类。 - **`InputStream`**:用于从源设备读取字节数据。 - **`OutputStream`**:用于向目标设备写入字节数据。 ##### 2. 字节流的基本API - **`public int...
在Java中,所有字节流类都是`java.io.InputStream`或`java.io.OutputStream`的子类。这两个类提供了基本的读写操作方法,例如`read()`和`write()`。 **1. 文件输出流(FileOutputStream)** - `FileOutputStream`类...
在Java编程语言中,输入/输出(I/O)操作是处理数据流的关键部分,而字符流与字节流则是实现这些操作的两种基本方式。理解它们的区别和应用场景对于任何Java开发者来说都是至关重要的。 ### 字节流 字节流是最基本...
在Java编程中,字节流(Byte Stream)是处理数据的基本方式,特别是在处理二进制数据,如图片、音频或视频文件时。本教程将详细讲解如何使用Java实现字节流与图片之间的转换,这对于在网络上传输或者存储图片等二...
在 Java 中,字节流文件读取可以通过多种方式来实现,包括使用 FileInputStream、FileOutputStream、BufferedInputStream 和 BufferedOutputStream 等。在本文中,我们将主要介绍使用 BufferedInputStream 实现字节...
总的来说,理解Java的IO系统,特别是字节流和字符流的概念,对于开发高效、可靠的程序至关重要。通过选择合适的流类型、使用缓冲流和桥接流,以及利用工具类,开发者可以更好地处理各种数据输入输出需求。在实际项目...
在Java编程语言中,字节流(Byte Stream)是I/O操作的基础,它处理的是单个字节的数据。...通过学习和理解这段代码,开发者可以深入理解Java字节流的工作原理,提升在处理二进制数据和网络通信时的能力。
Java 中的流操作可以分为两种:字节流和字符流。字节流是指以 byte 为单位进行读写操作的流,而字符流是指以 char 为单位进行读写操作的流。 字节流的介绍 字节流的所有读操作都继承自一个公共超类 java.io....
在Java中,IO流分为两大类:字节流(Byte Stream)和字符流(Character Stream)。字节流处理单个字节的数据,而字符流则处理Unicode编码的16位字符。 1. **字节流**: - `InputStream` 和 `OutputStream` 是所有...
本文将详细介绍如何使用Java中的字节流技术来实现从文件中按字节读取信息,并将其转换为字节数组。 #### Java中的字节流简介 Java提供了一套强大的流处理机制,使得开发者能够方便地进行数据的读写操作。字节流是...
Java的IO流是按照数据的流向分为输入流和输出流,按照数据类型分为字节流和字符流。字节流处理的是二进制数据,适用于任何类型的文件,包括文本文件和非文本文件(如图片、音频、视频等)。字符流则用于处理字符数据...
总的来说,Java基于IO流读取文件的过程包括以下几个步骤: 1. 获取文件路径并解码。 2. 创建`File`对象,表示要读取的文件。 3. 使用`FileInputStream`创建字节输入流,用于读取二进制数据。 4. 使用`...