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