计算机网络课程作业 — 基于 Java Socket 的 ATM 模拟系统
本项目实现了一个基于 C/S 架构 的 ATM(自动取款机)模拟系统,采用 Java Socket 进行网络通信。服务端支持多客户端并发访问,提供用户认证、余额查询、取款等核心银行业务功能。系统同时提供了命令行客户端和图形界面客户端两种交互方式。
┌──────────────┐ TCP Socket ┌──────────────┐
│ ATMClient │◄─────────────────────────►│ │
│ (命令行) │ 文本协议通信 │ ATMServer │
└──────────────┘ │ │
│ 多线程处理 │
┌──────────────┐ │ │
│ ATMGUI │◄─────────────────────────►│ 数据持久化 │
│ (图形界面) │ 文本协议通信 │ │
└──────────────┘ └──────┬───────┘
│
┌─────────────┴─────────────┐
│ users.txt balances.txt │
│ (用户口令) (账户余额) │
└───────────────────────────┘
├── src/
│ ├── ATMServer.java # 服务端:多线程处理客户端请求
│ ├── ATMClient.java # 命令行客户端
│ ├── ATMGUI.java # 图形界面客户端(Swing)
│ └── Main.java # 测试文件
├── users.txt # 用户数据(卡号 + 口令)
├── balances.txt # 余额数据(卡号 + 余额)
├── atm-server.log # 服务端运行日志(自动生成)
├── atm-client.log # 客户端运行日志(自动生成)
└── README.md
系统使用自定义的文本协议进行通信:
| 客户端发送 | 服务端响应 | 说明 |
|---|---|---|
HELO <卡号> |
500 AUTH REQUIRED! / 401 ERROR! |
卡号认证 |
PASS <口令> |
525 OK! / 401 ERROR! |
口令验证 |
BALA |
AMNT:<金额> |
查询余额 |
WDRA <金额> |
525 OK! / 401 ERROR! |
取款操作 |
QUIT |
BYE |
断开连接 |
认证最多重试 3 次,每次重试前会询问用户是否继续。
javac -d bin src/*.java# 使用默认端口 2525
java -cp bin ATMServer
# 指定端口
java -cp bin ATMServer 8888命令行客户端:
# 连接本地服务器(默认 127.0.0.1:2525)
java -cp bin ATMClient
# 指定服务器地址和端口
java -cp bin ATMClient 192.168.1.100 8888图形界面客户端:
# 连接本地服务器(默认 127.0.0.1:2525)
java -cp bin ATMGUI
# 指定服务器地址和端口
java -cp bin ATMGUI 192.168.1.100 8888| 卡号 | 口令 | 初始余额 |
|---|---|---|
| 100001 | 1234 | ¥5,000.00 |
| 100002 | 1111 | ¥1,000.50 |
| 100003 | 0721 | ¥6,000.00 |
- ✅ 多线程并发处理,支持同时连接多个客户端
- ✅ 用户数据从文件加载(
users.txt/balances.txt) - ✅ 取款后自动更新余额文件
- ✅ 完整的操作日志记录(
atm-server.log) - ✅ 支持自定义监听端口(默认 2525)
- ✅ 卡号 + 口令双重认证,最多 3 次重试
- ✅ 余额查询、取款操作
- ✅ 支持自定义服务器地址和端口
- ✅ 命令行客户端:轻量简洁,适合远程操作
- ✅ 图形界面客户端:Swing GUI,操作直观友好
- 🎨 现代化 UI 设计,三面板 CardLayout 切换
- 🔗 连接面板:可配置目标服务器 IP 和端口
- 🔐 登录面板:卡号/口令输入,支持回车快捷操作
- 💰 主面板:余额显示 + 取款操作,实时状态反馈
- 网络编程:
java.net.Socket/ServerSocketTCP 通信 - 并发处理:
ExecutorService线程池 +ConcurrentHashMap - 数据持久化:文件 I/O 读写用户数据和余额
- GUI 编程:Java Swing(
CardLayout、GridBagLayout) - 日志系统:带时间戳的日志输出(控制台 + 文件双写)
- JDK:8 及以上版本
- 操作系统:Windows / Linux / macOS
计算机学院 · 计算机网络课程作业