Java 文件传输客户端代码解析:逐行解释
这是一个使用 Java 编写的文件传输客户端程序,主要功能是选择本地文件并通过 Socket 连接将其发送到服务器端。下面将逐行解释代码的含义:
-
package 文件传送器;// 定义了一个名为 '文件传送器' 的包,用于组织代码结构。 -
import java.awt.BorderLayout;// 导入java.awt包中的BorderLayout类,用于管理窗口布局。 -
import java.awt.event.ActionEvent;// 导入java.awt.event包中的ActionEvent类,用于表示用户操作事件。 -
import java.awt.event.ActionListener;// 导入java.awt.event包中的ActionListener接口,用于定义处理用户操作事件的监听器。 -
import java.io.DataOutputStream;// 导入java.io包中的DataOutputStream类,用于将数据写入输出流。 -
import java.io.File;// 导入java.io包中的File类,用于表示文件和目录。 -
import java.io.FileInputStream;// 导入java.io包中的FileInputStream类,用于读取文件内容。 -
import java.net.Socket;// 导入java.net包中的Socket类,用于创建网络连接。 -
import javax.swing.JButton;// 导入javax.swing包中的JButton类,用于创建按钮。 -
import javax.swing.JFileChooser;// 导入javax.swing包中的JFileChooser类,用于创建文件选择器。 -
import javax.swing.JFrame;// 导入javax.swing包中的JFrame类,用于创建主窗口。 -
import javax.swing.JOptionPane;// 导入javax.swing包中的JOptionPane类,用于显示提示框。 -
import javax.swing.JPanel;// 导入javax.swing包中的JPanel类,用于创建面板。 -
import javax.swing.JTextField;// 导入javax.swing包中的JTextField类,用于创建文本框。 -
public class FileTransferClient extends JFrame {// 定义一个名为FileTransferClient的类,继承自JFrame类,用于创建客户端程序的主窗口。 -
private static final long serialVersionUID = 1L;// 序列化版本号,用于在序列化和反序列化时识别类。 -
private static final String SERVER_IP = "10.41.104.29";// 定义服务器的 IP 地址。 -
private static final int SERVER_PORT = 8899;// 定义服务器的端口号。 -
private Socket client;// 定义一个Socket对象,用于与服务器建立连接。 -
private FileInputStream fis;// 定义一个FileInputStream对象,用于读取文件内容。 -
private DataOutputStream dos;// 定义一个DataOutputStream对象,用于将数据写入输出流。 -
private JPanel panel;// 定义一个JPanel对象,用于放置界面元素。 -
private JTextField textField;// 定义一个JTextField对象,用于显示选择的本地文件路径。 -
private JButton chooseButton;// 定义一个JButton对象,用于选择本地文件。 -
private JButton sendButton;// 定义一个JButton对象,用于发送文件。 -
public FileTransferClient() {// 定义FileTransferClient类的构造方法。 -
super("文件传送Client端");// 调用JFrame类的构造方法,设置窗口标题为“文件传送Client端”。 -
setDefaultCloseOperation(EXIT_ON_CLOSE);// 设置窗口关闭时的操作为EXIT_ON_CLOSE,表示关闭窗口时退出程序。 -
setSize(400, 100);// 设置窗口大小为 400x100 像素。 -
panel = new JPanel();// 创建一个JPanel对象,用于放置界面元素。 -
textField = new JTextField(20);// 创建一个JTextField对象,指定宽度为 20 个字符。 -
chooseButton = new JButton("选择文件");// 创建一个名为“选择文件”的JButton对象。 -
sendButton = new JButton("发送文件");// 创建一个名为“发送文件”的JButton对象。 -
chooseButton.addActionListener(new ActionListener() {// 给“选择文件”按钮添加一个事件监听器,用于处理按钮点击事件。 -
@Override -
public void actionPerformed(ActionEvent e) {// 定义监听器的actionPerformed方法,该方法会在按钮被点击时执行。 -
JFileChooser fileChooser = new JFileChooser();// 创建一个JFileChooser对象,用于选择文件。 -
int result = fileChooser.showOpenDialog(panel);// 显示文件选择器,返回用户选择的操作结果。 -
if (result == JFileChooser.APPROVE_OPTION) {// 如果用户选择了“打开”操作,则执行以下代码。 -
File file = fileChooser.getSelectedFile();// 获取用户选择的文件。 -
textField.setText(file.getAbsolutePath());// 在文本框中显示选择的文件的绝对路径。 -
} -
} -
}); -
sendButton.addActionListener(new ActionListener() {// 给“发送文件”按钮添加一个事件监听器,用于处理按钮点击事件。 -
@Override -
public void actionPerformed(ActionEvent e) {// 定义监听器的actionPerformed方法,该方法会在按钮被点击时执行。 -
try {// 使用try...catch...finally语句处理异常。 -
String fileName = textField.getText();// 获取文本框中输入的文件名。 -
if (fileName.isEmpty()) {// 如果文件名为空,则提示用户选择文件。 -
JOptionPane.showMessageDialog(panel, "请选择要发送的文件");// 弹出提示框,提示用户选择文件。 -
return;// 结束方法执行。 -
} -
File file = new File(fileName);// 创建一个File对象,表示要发送的文件。 -
if (!file.exists()) {// 如果文件不存在,则提示用户重新选择文件。 -
JOptionPane.showMessageDialog(panel, "文件不存在,请重新选择");// 弹出提示框,提示用户重新选择文件。 -
return;// 结束方法执行。 -
} -
client = new Socket(SERVER_IP, SERVER_PORT);// 创建一个Socket对象,连接到服务器。 -
fis = new FileInputStream(file);// 创建一个FileInputStream对象,用于读取文件内容。 -
dos = new DataOutputStream(client.getOutputStream());// 创建一个DataOutputStream对象,用于将数据写入输出流。 -
dos.writeUTF(file.getName());// 将文件名写入输出流。 -
dos.flush();// 刷新输出流。 -
dos.writeLong(file.length());// 将文件长度写入输出流。 -
dos.flush();// 刷新输出流。 -
System.out.println("======== 开始传输文件 ========");// 在控制台输出提示信息。 -
byte[] bytes = new byte[1024];// 定义一个大小为 1024 字节的字节数组,用于缓存文件数据。 -
int length = 0;// 定义一个变量,用于记录每次读取的字节数。 -
long progress = 0;// 定义一个变量,用于记录文件传输进度。 -
while ((length = fis.read(bytes, 0, bytes.length)) != -1) {// 循环读取文件内容,直到文件末尾。 -
dos.write(bytes, 0, length);// 将读取到的数据写入输出流。 -
dos.flush();// 刷新输出流。 -
progress += length;// 更新文件传输进度。 -
System.out.print("| " + (100 * progress / file.length()) + "% |");// 在控制台输出文件传输进度。 -
} -
System.out.println();// 在控制台换行。 -
System.out.println("======== 文件传输成功 ========");// 在控制台输出提示信息。 -
} catch (Exception ex) {// 捕获异常,并打印异常信息。 -
ex.printStackTrace();// 打印异常信息。 -
} finally {// 无论是否发生异常,都会执行finally块中的代码。 -
try {// 使用try...catch语句处理异常。 -
if (fis != null) -
fis.close();// 关闭文件输入流。 -
if (dos != null) -
dos.close();// 关闭数据输出流。 -
if (client != null) -
client.close();// 关闭网络连接。 -
} catch (Exception ex) {// 捕获异常,并打印异常信息。 -
ex.printStackTrace();// 打印异常信息。 -
} -
} -
} -
}); -
panel.add(textField);// 将文本框添加到面板中。 -
panel.add(chooseButton);// 将“选择文件”按钮添加到面板中。 -
panel.add(sendButton);// 将“发送文件”按钮添加到面板中。 -
add(panel, BorderLayout.CENTER);// 将面板添加到窗口中,并使用BorderLayout布局管理器,将面板放置在窗口的中心位置。 -
setVisible(true);// 设置窗口可见。 -
} -
public static void main(String[] args) {// 程序入口,定义主方法。 -
new FileTransferClient();// 创建一个FileTransferClient对象,启动客户端程序。 -
}
原文地址: https://www.cveoy.top/t/topic/ocr6 著作权归作者所有。请勿转载和采集!