# 🚀 Rtty 项目实现总结与目录导航 > **Rtty** 是一款基于 Rust + Flutter 构建的高性能、跨平台分布式虚拟终端系统。 > 服务端(Rust + Alacritty 引擎)在内存中维持"真相源",通过 WebSocket 与各端解耦; > 桌面端(Flutter + `flutter_alacritty`)共享同一 Alacritty 引擎做工业级 ANSI 渲染; > 移动端(Flutter)消费语义化快照做卡片化重排。 --- ## 一、总体架构 ```mermaid flowchart LR subgraph Server["rtty-server (Rust)"] PTY["portable-pty
伪终端 / Shell"] ENGINE["alacritty_terminal
真相源 · ANSI 解析 · 屏幕网格"] WS["Axum WebSocket
session 管理 / 广播"] end subgraph Desktop["rtty-desktop (Flutter Windows)"] BACKEND["RttyPtyBackend
WebSocket 桥接"] DENGINE["flutter_alacritty
Alacritty 引擎渲染"] end subgraph Mobile["rtty-mobile (Flutter)"] MCLIENT["RttyMobileClient
语义快照消费"] MUI["卡片化 / 换行 / Keybar"] end PTY --> ENGINE --> WS WS -->|"原始 ANSI 二进制帧
client=desktop"| BACKEND --> DENGINE WS -->|"语义化 JSON 快照
client=mobile"| MCLIENT --> MUI ``` --- ## 二、目录树状图与功能对应 ### 1. 服务端内核 `src/`(Rust) ``` src/ ├── main.rs # 程序入口:全局 AppState(会话表)、Axum 路由、配置加载 ├── config.rs # ServerConfig:host/port/shell/尺寸/scrollback/并发限制/空闲超时(环境变量 RTTY_* 可覆盖) ├── terminal/ # 终端核心(PTY + Alacritty 引擎) │ ├── mod.rs # terminal 模块声明 │ ├── pty.rs # PtySession:portable-pty 伪终端封装(拉起 Shell、读写、resize、kill) │ └── engine.rs # TerminalEngine:alacritty_terminal 封装(ANSI 解析、网格维护、语义快照生成、PtyWrite 回写) └── ws/ # WebSocket 通信层 ├── mod.rs # ws 模块声明 ├── protocol.rs # 协议:ClientMessage(input/resize/claim_control/ping)、ServerMessage(ready/snapshot/control/error/session_closed)、MobileSnapshot └── handler.rs # 会话管理:多端解耦广播、并发限制、控制权强制、会话清理(EOF + 进程监控 + 空闲超时) ``` | 功能 | 对应文件 | |------|---------| | 伪终端创建 / Shell 拉起 / 读写 / resize | `src/terminal/pty.rs` | | ANSI 解析 / 屏幕网格 / 滚动历史 / 语义快照 | `src/terminal/engine.rs` | | 断线重连状态恢复(初始快照) | `src/ws/handler.rs` | | 多端解耦(PC 收 ANSI、移动收快照) | `src/ws/handler.rs` | | 控制权强制(非控制者输入被拒) | `src/ws/handler.rs` | | 会话清理(泄漏防护) | `src/ws/handler.rs` | | 配置加载(环境变量) | `src/config.rs` | --- ### 2. 桌面端 `desktop/`(Flutter Windows) ``` desktop/ ├── lib/ │ ├── main.dart # 入口:初始化 RustLib(flutter_rust_bridge)后启动应用 │ └── src/ │ ├── rtty_pty_backend.dart # RttyPtyBackend:实现 flutter_alacritty 的 PtyBackend 接口,桥接 WebSocket │ ├── terminal_config.dart # RttyTerminalConfig:把 Rtty 配色/字体映射为 Alacritty TerminalConfig │ ├── terminal_screen.dart # 主页面:TerminalEngine + TerminalView、连接控制、resize 防抖、双向接线 │ ├── connection_bar.dart # 顶部连接控制条:状态灯、host/port/session 输入、会话徽章、连接按钮 │ └── theme.dart # 工业终端主题(深炭黑 + 磷光青绿) ├── test/ # 单元测试(服务端离线时集成测试自动跳过) │ ├── e2e_ws_test.dart # RttyPtyBackend 连真实服务端接收原始 ANSI 输出 │ ├── regression_ws_test.dart# 多端解耦 + 控制权强制 + 会话清理回归 │ ├── support.dart # 测试共享工具(服务端探测) │ └── widget_test.dart # Widget 渲染测试 ├── integration_test/ # 真实 Windows 桌面集成测试 │ ├── e2e_test.dart # 连接 + 渲染 + 命令回显闭环 │ └── cd_resize_test.dart # cd 跨目录 + resize 内容完整性 ├── windows/ # Windows 平台 CMake/runner(flutter 生成) ├── pubspec.yaml # 依赖:web_socket_channel、flutter_alacritty └── README.md # 桌面端说明 ``` | 功能 | 对应文件 | |------|---------| | Alacritty Rust 引擎初始化 | `lib/main.dart`(`await RustLib.init()`) | | WebSocket ↔ PtyBackend 桥接(远程数据源) | `lib/src/rtty_pty_backend.dart` | | 引擎接线(输出喂渲染、输入回传服务端) | `lib/src/terminal_screen.dart` | | 100% 工业级 ANSI 渲染(vim/htop/tmux) | `lib/src/terminal_screen.dart` + `flutter_alacritty` | | resize 防抖(TUI resize 稳定性) | `lib/src/terminal_screen.dart` | | 连接控制条 / 会话管理 | `lib/src/connection_bar.dart` | | 主题 / 配色 | `lib/src/theme.dart`、`lib/src/terminal_config.dart` | --- ### 3. 移动端 `mobile/`(Flutter) ``` mobile/ ├── lib/ │ ├── main.dart # 入口 │ └── src/ │ ├── rtty_mobile_client.dart # RttyMobileClient:消费 mobile_snapshot 语义快照,发送 input/resize/claim_control │ └── theme.dart # 移动端主题(卡片化美学) ├── android/ # Android 平台工程(flutter 生成) ├── ios/ # iOS 平台工程(flutter 生成) └── pubspec.yaml # 依赖:web_socket_channel ``` > ⚠️ **当前状态**:移动端为脚手架骨架(客户端连接层与主题已就绪),卡片化重排、Keybar 等核心 UI 尚未实现,尚未提交 Git。这是规划中的下一个里程碑。 | 功能 | 对应文件 | |------|---------| | 语义快照 WebSocket 消费 | `mobile/lib/src/rtty_mobile_client.dart` | | 智能换行 / 卡片化 / Keybar | ⏳ 待实现 | --- ### 4. 根目录其他文件 ``` Rtty/ ├── src/ # 服务端源码(见上) ├── desktop/ # 桌面端(见上) ├── mobile/ # 移动端(见上) ├── Cargo.toml # 服务端依赖与 release 优化配置 ├── Cargo.lock # Rust 依赖锁 ├── README.md # 项目设计总结与架构指南 ├── LICENSE # 许可证 └── .gitignore # 忽略 target/.idea/Cargo.lock 等 ``` --- ## 三、核心功能清单(实现 vs 规划) | 功能 | 服务端 | 桌面端 | 移动端 | 状态 | |------|:---:|:---:|:---:|:---:| | PTY / Shell 会话 | ✅ | — | — | 已实现 | | Alacritty 引擎(ANSI 解析 / 网格) | ✅ | ✅ | — | 已实现 | | 多端状态保持(断线重连恢复) | ✅ | ✅ | ⏳ | 已实现 | | 多端解耦(PC ANSI / 移动快照) | ✅ | ✅ | ⏳ | 已实现 | | 控制权强制 | ✅ | — | ⏳ | 已实现 | | 会话清理(空闲超时) | ✅ | — | — | 已实现 | | 100% 工业级 ANSI 渲染 | — | ✅ | — | 已实现 | | 命令执行 / cd / TUI resize 稳定 | — | ✅ | — | 已实现 | | 智能文本换行(Word Wrap) | — | — | ⏳ | 规划 | | 卡片化命令交互 | — | — | ⏳ | 规划 | | 移动端 Keybar | — | — | ⏳ | 规划 | | 分布式横向扩展 | ⏳ | — | — | 规划 | | 服务端鉴权 | ⏳ | — | — | 规划 | --- ## 四、运行与构建 ```bash # 1. 服务端(仓库根目录) cargo run # 监听 ws://0.0.0.0:8080 # 2. 桌面端 cd desktop flutter run -d windows # 运行 flutter build windows --release # 构建(含 Rust 引擎编译) # 3. 测试 cargo test # 服务端 flutter test # 桌面端单元测试(服务端离线时集成测试跳过) flutter test integration_test -d windows # 桌面端真实桌面集成测试 ``` --- ## 五、目录导航速查 - **要改终端解析/网格逻辑** → `src/terminal/engine.rs` - **要改 PTY/进程管理** → `src/terminal/pty.rs` - **要改协议/消息格式** → `src/ws/protocol.rs` - **要改会话/多端/清理逻辑** → `src/ws/handler.rs` - **要改桌面端连接桥接** → `desktop/lib/src/rtty_pty_backend.dart` - **要改桌面端渲染/接线** → `desktop/lib/src/terminal_screen.dart` - **要改桌面端 UI/主题** → `desktop/lib/src/connection_bar.dart`、`theme.dart` - **要改移动端连接层** → `mobile/lib/src/rtty_mobile_client.dart`