Java TCP文件传输
1. 简介
在计算机网络中,文件传输协议(File Transfer Protocol, FTP)是一种用于在不同主机之间传输文件的标准网络协议。然而,FTP协议并不是唯一的文件传输方式,还可以使用TCP协议进行文件传输。
本文将介绍如何使用Java TCP协议进行多文件传输,包括建立TCP连接、发送和接收文件等操作。我们将使用Java Socket类库来实现文件传输功能。
2. TCP协议概述
TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层协议。它通过三次握手建立连接,并提供可靠的数据传输。TCP协议使用端口号来区分不同的应用程序,建立连接后通过发送和接收数据来实现应用程序之间的通信。
3. Java Socket类库简介
Java提供了Socket类和ServerSocket类用于实现TCP协议的通信。Socket类代表一个客户端套接字,用于与服务器建立连接和发送接收数据。ServerSocket类代表一个服务器套接字,用于监听客户端的连接请求并与客户端建立连接。
4. 建立TCP连接
在进行文件传输之前,首先需要建立一个TCP连接。下面是一个简单的Java代码示例,演示如何在客户端和服务器端建立TCP连接:
// 客户端代码
Socket clientSocket = new Socket("服务器IP地址", 12345);
// 服务器端代码
ServerSocket serverSocket = new ServerSocket(12345);
Socket clientSocket = serverSocket.accept();
上述代码中,客户端通过Socket
类的构造函数传入服务器的IP地址和端口号来建立连接。服务器端通过ServerSocket
类的构造函数指定端口号,并使用accept()
方法监听客户端的连接请求。
5. 发送和接收文件
在建立TCP连接之后,就可以进行文件的发送和接收了。下面是一个简单的Java代码示例,演示如何使用Socket
类进行文件传输:
// 客户端代码
File file = new File("文件路径");
InputStream inputStream = new FileInputStream(file);
OutputStream outputStream = clientSocket.getOutputStream();
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
// 服务器端代码
File file = new File("文件路径");
OutputStream outputStream = new FileOutputStream(file);
InputStream inputStream = clientSocket.getInputStream();
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
上述代码中,客户端通过FileInputStream
类读取文件内容,并使用getOutputStream()
方法获取输出流发送数据。服务器端通过FileOutputStream
类写入文件内容,并使用getInputStream()
方法获取输入流接收数据。
6. 多文件传输
如果要传输多个文件,可以在文件传输前,先发送文件的元信息,例如文件名、文件大小等。下面是一个简单的Java代码示例,演示如何传输多个文件:
// 客户端代码
DataOutputStream dataOutputStream = new DataOutputStream(clientSocket.getOutputStream());
// 发送文件数量
dataOutputStream.writeInt(fileList.size());
for (File file : fileList) {
// 发送文件名
dataOutputStream.writeUTF(file.getName());
// 发送文件大小
dataOutputStream.writeLong(file.length());
// 发送文件内容
InputStream inputStream = new FileInputStream(file);
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
dataOutputStream.write(buffer, 0, bytesRead);
}
}
// 服务器端代码
DataInputStream dataInputStream = new DataInputStream(clientSocket.getInputStream());
// 接收文件数量
int fileCount = dataInputStream.readInt();
for (int i = 0; i < fileCount; i++) {
// 接收文件名
String fileName = dataInputStream.readUTF();
// 接收文件大小
long fileSize = dataInputStream.readLong();
// 接收文件内容
OutputStream outputStream = new FileOutputStream(fileName);
byte[] buffer = new byte[4096];
int bytesRead;
while (fileSize > 0 && (bytesRead = dataInputStream.read(buffer, 0, (int) Math.min