基于 TCP 协议的客户端/服务器文件传输应用程序,使用 Java 实现。
目标
- ✅ 使用 TCP 协议实现 C/S 架构
- ✅ 处理 TCP 的”面向字节流”特性
- ✅ 使用应用层协议解决”粘包”和”消息边界”问题
- ✅ 实现文件 I/O 操作
功能特性
服务器端
- 使用
bind()和listen()在端口 9000 上监听 - 使用
accept()接受客户端连接 - 处理文件上传和下载请求
- 将上传的文件存储在
server_files/目录中
客户端
- 连接到 localhost:9000 的服务器
- UPLOAD 命令:上传文件到服务器
- 发送文件名(元数据)→ 文件大小(元数据)→ 文件内容
- DOWNLOAD 命令:从服务器下载文件
- 发送文件名 → 接收文件大小(元数据)→ 接收文件内容
协议如何解决粘包问题
应用程序使用应用层协议来处理消息边界:
- 字符串消息:使用
DataInputStream.readUTF()和DataOutputStream.writeUTF(),它们在字符串数据之前自动处理长度前缀(2 字节) - 文件大小:使用
readLong()和writeLong()处理固定大小的 8 字节元数据 - 文件内容:固定的协议顺序确保正确解析:
- 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_ 前缀

评论(0)
暂无评论