# 12306 **Repository Path**: ljq2033/12306 ## Basic Information - **Project Name**: 12306 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-12-05 - **Last Updated**: 2025-12-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 12306 售票系统模拟 (OS 大作业) 本项目是一个基于 JavaFX 和 Socket 通信的 C/S 架构售票系统,模拟了操作系统中的并发控制、锁机制和死锁检测。 ## 📂 代码结构说明 代码位于 `src/main/java/com/ticket/system/` 下,主要分为以下几个包: ### 1. `client` (客户端) 负责购票终端的逻辑,运行在用户的电脑上。 * **`ClientApp.java`**: **[入口]** 客户端主程序。启动 JavaFX 图形界面,生成随机终端 ID (如 `TERM-1234`)。 * **`NetworkClient.java`**: **[通信]** 网络通信核心类。负责与服务器建立 Socket 连接,发送请求 (`Request`) 并接收响应 (`Response`)。 * **`StressTestApp.java`**: **[测试]** 压力测试工具。模拟 50+ 个并发用户同时抢票,用于测试服务器的并发处理能力和锁机制。 ### 2. `server` (服务器端) 负责处理网络连接和请求分发,运行在主机上。 * **`ServerApp.java`**: **[入口]** 服务器主程序。启动 ServerSocket 监听 `12306` 端口,并同时启动服务器管理后台界面。 * **`ClientHandler.java`**: **[线程]** 客户端处理器。每当有一个客户端连接,服务器就会创建一个新的 `ClientHandler` 线程,专门负责处理该客户端的请求。 * **`ServerStatusManager.java`**: **[状态]** 服务器状态管理器。维护当前在线的客户端列表及其状态(如:正在购票、已支付等),供监控界面使用。 ### 3. `os_kernel` (核心内核层) 模拟操作系统的核心功能,是系统的逻辑中心,**所有业务逻辑都在这里**。 * **`SystemCallLayer.java`**: **[接口]** 系统调用层。向外(Controller/Server)提供统一的接口(如 `bookTicket`, `getAllTrains`),屏蔽底层复杂性。 * **`ProcessLayer.java`**: **[核心]** 进程管理层。**这是最关键的代码**。处理并发购票、锁机制(互斥锁)、死锁检测与恢复逻辑。 * **`DataLayer.java`**: **[数据]** 数据层。模拟内存/文件系统。存储列车、席位、订单等数据,提供数据的增删改查。 ### 4. `controller` (界面控制器) JavaFX 的控制器,负责界面交互逻辑。 * **`PurchaseTerminalController.java`**: **[客户端]** 购票终端界面。处理用户选票、锁票、支付的交互逻辑,并包含定时刷新列车列表的逻辑。 * **`TicketStatusMonitorController.java`**: **[服务端]** 票务监控界面。实时显示总票数、销售额、在线终端列表等。 * **`TicketSourceController.java`**: **[服务端]** 票源管理界面。允许管理员添加或修改列车计划。 * **`MainMenuController.java`**: **[服务端]** 服务器端的主菜单导航。 * **`LogMonitorController.java`**: **[服务端]** 日志监控界面。 ### 5. `message` (通信协议) 定义客户端与服务器交互的消息对象(DTO)。 * **`Request.java`**: 请求包(包含请求类型 `type`、数据 `payload`、客户端ID `clientId`)。 * **`Response.java`**: 响应包(包含状态 `status` 和数据 `data`)。 * **`PurchaseTicketRequest.java`**: 专门用于购票请求的数据结构。 ### 6. `model` (数据模型) 定义系统中的实体对象。 * **`Train.java`**: 列车信息(车次、起终点、发车时间、席位信息)。 * **`Ticket.java`**: 车票信息(属于哪个用户、哪个车次)。 * **`Seat.java`**: 席位模型(用于 UI 表格显示)。 --- ## 🚀 如何运行 ### 1. 启动服务器 (主机) 运行 `ServerApp`。它会启动后台服务和管理界面。 ```powershell mvn org.codehaus.mojo:exec-maven-plugin:3.1.0:java "-Dexec.mainClass=com.ticket.system.server.ServerApp" ``` ### 2. 启动客户端 (购票终端) 运行 `ClientApp`。可以启动多个客户端模拟不同用户。 ```powershell mvn org.codehaus.mojo:exec-maven-plugin:3.1.0:java "-Dexec.mainClass=com.ticket.system.client.ClientApp" ``` *注:如果在另一台电脑运行,需添加参数 `-Dserver.host=服务器IP`* ### 3. 运行压力测试 运行 `StressTestApp`。模拟高并发抢票场景。 ```powershell mvn org.codehaus.mojo:exec-maven-plugin:3.1.0:java "-Dexec.mainClass=com.ticket.system.client.StressTestApp" ``` --- ## 💡 核心机制说明 1. **C/S 架构**: 客户端只负责显示和发送请求,所有逻辑计算(如余票判断、扣减)都在服务器的 `os_kernel` 层完成。 2. **并发控制**: 使用 `ReentrantLock` 或 `synchronized` 保证同一张票不会被两个人同时买走。 3. **锁票机制**: 用户点击“购买”后,系统会先“锁定”席位 60 秒(模拟支付时间),此时席位减少但未生成最终订单。 4. **自动刷新**: 客户端通过 `Timeline` 每 3 秒向服务器请求一次最新数据,实现增量更新。