这是一个使用 Java 编写的文件传输客户端程序,主要功能是选择本地文件并通过 Socket 连接将其发送到服务器端。下面将逐行解释代码的含义:

  1. package 文件传送器; // 定义了一个名为 '文件传送器' 的包,用于组织代码结构。

  2. import java.awt.BorderLayout; // 导入 java.awt 包中的 BorderLayout 类,用于管理窗口布局。

  3. import java.awt.event.ActionEvent; // 导入 java.awt.event 包中的 ActionEvent 类,用于表示用户操作事件。

  4. import java.awt.event.ActionListener; // 导入 java.awt.event 包中的 ActionListener 接口,用于定义处理用户操作事件的监听器。

  5. import java.io.DataOutputStream; // 导入 java.io 包中的 DataOutputStream 类,用于将数据写入输出流。

  6. import java.io.File; // 导入 java.io 包中的 File 类,用于表示文件和目录。

  7. import java.io.FileInputStream; // 导入 java.io 包中的 FileInputStream 类,用于读取文件内容。

  8. import java.net.Socket; // 导入 java.net 包中的 Socket 类,用于创建网络连接。

  9. import javax.swing.JButton; // 导入 javax.swing 包中的 JButton 类,用于创建按钮。

  10. import javax.swing.JFileChooser; // 导入 javax.swing 包中的 JFileChooser 类,用于创建文件选择器。

  11. import javax.swing.JFrame; // 导入 javax.swing 包中的 JFrame 类,用于创建主窗口。

  12. import javax.swing.JOptionPane; // 导入 javax.swing 包中的 JOptionPane 类,用于显示提示框。

  13. import javax.swing.JPanel; // 导入 javax.swing 包中的 JPanel 类,用于创建面板。

  14. import javax.swing.JTextField; // 导入 javax.swing 包中的 JTextField 类,用于创建文本框。

  15. public class FileTransferClient extends JFrame { // 定义一个名为 FileTransferClient 的类,继承自 JFrame 类,用于创建客户端程序的主窗口。

  16. private static final long serialVersionUID = 1L; // 序列化版本号,用于在序列化和反序列化时识别类。

  17. private static final String SERVER_IP = "10.41.104.29"; // 定义服务器的 IP 地址。

  18. private static final int SERVER_PORT = 8899; // 定义服务器的端口号。

  19. private Socket client; // 定义一个 Socket 对象,用于与服务器建立连接。

  20. private FileInputStream fis; // 定义一个 FileInputStream 对象,用于读取文件内容。

  21. private DataOutputStream dos; // 定义一个 DataOutputStream 对象,用于将数据写入输出流。

  22. private JPanel panel; // 定义一个 JPanel 对象,用于放置界面元素。

  23. private JTextField textField; // 定义一个 JTextField 对象,用于显示选择的本地文件路径。

  24. private JButton chooseButton; // 定义一个 JButton 对象,用于选择本地文件。

  25. private JButton sendButton; // 定义一个 JButton 对象,用于发送文件。

  26. public FileTransferClient() { // 定义 FileTransferClient 类的构造方法。

  27. super("文件传送Client端"); // 调用 JFrame 类的构造方法,设置窗口标题为“文件传送Client端”。

  28. setDefaultCloseOperation(EXIT_ON_CLOSE); // 设置窗口关闭时的操作为 EXIT_ON_CLOSE,表示关闭窗口时退出程序。

  29. setSize(400, 100); // 设置窗口大小为 400x100 像素。

  30. panel = new JPanel(); // 创建一个 JPanel 对象,用于放置界面元素。

  31. textField = new JTextField(20); // 创建一个 JTextField 对象,指定宽度为 20 个字符。

  32. chooseButton = new JButton("选择文件"); // 创建一个名为“选择文件”的 JButton 对象。

  33. sendButton = new JButton("发送文件"); // 创建一个名为“发送文件”的 JButton 对象。

  34. chooseButton.addActionListener(new ActionListener() { // 给“选择文件”按钮添加一个事件监听器,用于处理按钮点击事件。

  35. @Override

  36. public void actionPerformed(ActionEvent e) { // 定义监听器的 actionPerformed 方法,该方法会在按钮被点击时执行。

  37. JFileChooser fileChooser = new JFileChooser(); // 创建一个 JFileChooser 对象,用于选择文件。

  38. int result = fileChooser.showOpenDialog(panel); // 显示文件选择器,返回用户选择的操作结果。

  39. if (result == JFileChooser.APPROVE_OPTION) { // 如果用户选择了“打开”操作,则执行以下代码。

  40. File file = fileChooser.getSelectedFile(); // 获取用户选择的文件。

  41. textField.setText(file.getAbsolutePath()); // 在文本框中显示选择的文件的绝对路径。

  42. }

  43. }

  44. });

  45. sendButton.addActionListener(new ActionListener() { // 给“发送文件”按钮添加一个事件监听器,用于处理按钮点击事件。

  46. @Override

  47. public void actionPerformed(ActionEvent e) { // 定义监听器的 actionPerformed 方法,该方法会在按钮被点击时执行。

  48. try { // 使用 try...catch...finally 语句处理异常。

  49. String fileName = textField.getText(); // 获取文本框中输入的文件名。

  50. if (fileName.isEmpty()) { // 如果文件名为空,则提示用户选择文件。

  51. JOptionPane.showMessageDialog(panel, "请选择要发送的文件"); // 弹出提示框,提示用户选择文件。

  52. return; // 结束方法执行。

  53. }

  54. File file = new File(fileName); // 创建一个 File 对象,表示要发送的文件。

  55. if (!file.exists()) { // 如果文件不存在,则提示用户重新选择文件。

  56. JOptionPane.showMessageDialog(panel, "文件不存在,请重新选择"); // 弹出提示框,提示用户重新选择文件。

  57. return; // 结束方法执行。

  58. }

  59. client = new Socket(SERVER_IP, SERVER_PORT); // 创建一个 Socket 对象,连接到服务器。

  60. fis = new FileInputStream(file); // 创建一个 FileInputStream 对象,用于读取文件内容。

  61. dos = new DataOutputStream(client.getOutputStream()); // 创建一个 DataOutputStream 对象,用于将数据写入输出流。

  62. dos.writeUTF(file.getName()); // 将文件名写入输出流。

  63. dos.flush(); // 刷新输出流。

  64. dos.writeLong(file.length()); // 将文件长度写入输出流。

  65. dos.flush(); // 刷新输出流。

  66. System.out.println("======== 开始传输文件 ========"); // 在控制台输出提示信息。

  67. byte[] bytes = new byte[1024]; // 定义一个大小为 1024 字节的字节数组,用于缓存文件数据。

  68. int length = 0; // 定义一个变量,用于记录每次读取的字节数。

  69. long progress = 0; // 定义一个变量,用于记录文件传输进度。

  70. while ((length = fis.read(bytes, 0, bytes.length)) != -1) { // 循环读取文件内容,直到文件末尾。

  71. dos.write(bytes, 0, length); // 将读取到的数据写入输出流。

  72. dos.flush(); // 刷新输出流。

  73. progress += length; // 更新文件传输进度。

  74. System.out.print("| " + (100 * progress / file.length()) + "% |"); // 在控制台输出文件传输进度。

  75. }

  76. System.out.println(); // 在控制台换行。

  77. System.out.println("======== 文件传输成功 ========"); // 在控制台输出提示信息。

  78. } catch (Exception ex) { // 捕获异常,并打印异常信息。

  79. ex.printStackTrace(); // 打印异常信息。

  80. } finally { // 无论是否发生异常,都会执行 finally 块中的代码。

  81. try { // 使用 try...catch 语句处理异常。

  82. if (fis != null)

  83. fis.close(); // 关闭文件输入流。

  84. if (dos != null)

  85. dos.close(); // 关闭数据输出流。

  86. if (client != null)

  87. client.close(); // 关闭网络连接。

  88. } catch (Exception ex) { // 捕获异常,并打印异常信息。

  89. ex.printStackTrace(); // 打印异常信息。

  90. }

  91. }

  92. }

  93. });

  94. panel.add(textField); // 将文本框添加到面板中。

  95. panel.add(chooseButton); // 将“选择文件”按钮添加到面板中。

  96. panel.add(sendButton); // 将“发送文件”按钮添加到面板中。

  97. add(panel, BorderLayout.CENTER); // 将面板添加到窗口中,并使用 BorderLayout 布局管理器,将面板放置在窗口的中心位置。

  98. setVisible(true); // 设置窗口可见。

  99. }

  100. public static void main(String[] args) { // 程序入口,定义主方法。

  101. new FileTransferClient(); // 创建一个 FileTransferClient 对象,启动客户端程序。

  102. }

Java 文件传输客户端代码解析:逐行解释

原文地址: https://www.cveoy.top/t/topic/ocr6 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录