boxmoe_header_banner_img

Hello! 欢迎来到盒子萌!

文章导读

TCP 文件传输应用程序


avatar
Aikl 2026年1月7日 13

基于 TCP 协议的客户端/服务器文件传输应用程序,使用 Java 实现。

目标

  • ✅ 使用 TCP 协议实现 C/S 架构
  • ✅ 处理 TCP 的”面向字节流”特性
  • ✅ 使用应用层协议解决”粘包”和”消息边界”问题
  • ✅ 实现文件 I/O 操作

功能特性

服务器端

  • 使用 bind()listen() 在端口 9000 上监听
  • 使用 accept() 接受客户端连接
  • 处理文件上传和下载请求
  • 将上传的文件存储在 server_files/ 目录中

客户端

  • 连接到 localhost:9000 的服务器
  • UPLOAD 命令:上传文件到服务器
    • 发送文件名(元数据)→ 文件大小(元数据)→ 文件内容
  • DOWNLOAD 命令:从服务器下载文件
    • 发送文件名 → 接收文件大小(元数据)→ 接收文件内容

协议如何解决粘包问题

应用程序使用应用层协议来处理消息边界:

  1. 字符串消息:使用 DataInputStream.readUTF()DataOutputStream.writeUTF(),它们在字符串数据之前自动处理长度前缀(2 字节)
  2. 文件大小:使用 readLong()writeLong() 处理固定大小的 8 字节元数据
  3. 文件内容:固定的协议顺序确保正确解析:
    • UPLOAD:命令 → 文件名(带长度前缀的字符串)→ 文件大小(8 字节)→ 文件内容(精确字节数)
    • DOWNLOAD:命令 → 文件名(带长度前缀的字符串)→ 文件大小(8 字节)→ 文件内容(精确字节数)

这种方法确保了接收方始终能够正确识别一个消息的结束和下一个消息的开始。

关键 Socket 函数

  • socket()new ServerSocket(PORT)(服务器端)/ new Socket(HOST, PORT)(客户端)
  • bind():在 ServerSocket 构造函数中隐式调用
  • listen():创建 ServerSocket 时隐式调用
  • accept()serverSocket.accept() – 阻塞直到客户端连接

编译和运行

编译

Windows 系统(推荐使用脚本):

compile.bat

或者手动编译(Windows 需要指定 UTF-8 编码):

javac -encoding UTF-8 FileTransferServer.java
javac -encoding UTF-8 FileTransferClient.java
javac -encoding UTF-8 FileTransferServerGUI.java
javac -encoding UTF-8 FileTransferClientGUI.java

Linux/Mac 系统:

javac FileTransferServer.java
javac FileTransferClient.java
javac FileTransferServerGUI.java
javac FileTransferClientGUI.java

运行方式

本项目提供了两种运行方式:命令行版本图形界面版本

命令行版本

运行服务器:

Windows 系统(推荐使用脚本):

run_server.bat

或者手动运行:

java FileTransferServer

运行客户端:

Windows 系统(推荐使用脚本):

run_client.bat

或者手动运行:

java FileTransferClient

图形界面版本(推荐)

运行服务器GUI:

Windows 系统:

run_server_gui.bat

或者手动运行:

java FileTransferServerGUI

运行客户端GUI:

Windows 系统:

run_client_gui.bat

或者手动运行:

java FileTransferClientGUI

GUI 版本功能

服务器GUI:
– 可视化界面,易于操作
– 可设置监听端口
– 启动/停止服务器按钮
– 实时显示服务器日志
– 显示服务器运行状态

客户端GUI:
– 图形化操作界面
– 可设置服务器地址和端口
– 连接/断开按钮
– 文件选择对话框(上传)
– 文件下载功能(可选择保存位置)
– 实时显示操作日志
– 显示连接状态

服务器将在端口 9000 上开始监听(默认值,可在GUI中修改)。

使用示例

上传文件:

Enter command: UPLOAD test.txt

下载文件:

Enter command: DOWNLOAD test.txt

退出:

Enter command: EXIT

目录结构

.
├── FileTransferServer.java       # 服务器实现(命令行版本)
├── FileTransferClient.java       # 客户端实现(命令行版本)
├── FileTransferServerGUI.java    # 服务器实现(GUI版本)
├── FileTransferClientGUI.java    # 客户端实现(GUI版本)
├── README.md                     # 本文件
├── compile.bat                   # Windows 编译脚本
├── run_server.bat                # Windows 服务器运行脚本(命令行)
├── run_client.bat                # Windows 客户端运行脚本(命令行)
├── run_server_gui.bat            # Windows 服务器运行脚本(GUI)
├── run_client_gui.bat            # Windows 客户端运行脚本(GUI)
└── server_files/                 # 服务器创建的目录,用于存储上传的文件

注意事项

<

ul>

  • 上传的文件存储在 server_files/ 目录中
  • 下载的文件保存时带有 downloaded_ 前缀
  • 服务器使用线程并发处理多个客户端
  • 对于大文件(>1MB)会显示进度指示器


  • 评论(0)

    查看评论列表

    暂无评论


    发表评论

    表情 颜文字
    插入代码

    近期评论

    您尚未收到任何评论。

    分类