# isolated-messenger **Repository Path**: drewat/isolated-messenger ## Basic Information - **Project Name**: isolated-messenger - **Description**: No description available - **Primary Language**: Rust - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-03-12 - **Last Updated**: 2026-03-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Isolated Messenger - 隔离网络即时通信系统 一个专为**物理隔离网络环境**设计的即时通信解决方案,通过共享文件夹实现跨网络的安全消息传递。 ## 功能特性 - **文字消息**: 实时发送和接收文字消息 - **图片传输**: 支持各种格式图片的发送和预览 - **文件传输**: 支持任意类型文件的传输 - **实时同步**: 500ms 轮询间隔的准实时消息同步 - **安全可靠**: 消息完整性校验,支持加密传输 - **跨平台**: 支持 Windows、Linux、macOS ## 项目结构 ``` isolated-messenger/ ├── src/ │ ├── main.rs # 程序入口,启动 Web 服务器和同步任务 │ ├── lib.rs # 库入口,声明模块 │ ├── config.rs # 配置管理,定义 inbox/outbox 路径 │ ├── message.rs # 消息结构定义(Message, MessageContent) │ ├── storage.rs # SQLite 数据库操作 │ ├── sync.rs # 文件同步引擎(定时轮询共享文件夹) │ ├── api.rs # HTTP/WebSocket API 处理 │ └── frontend/ │ ├── index.html # Web 界面 │ ├── app.js # 前端逻辑(WebSocket、消息渲染) │ └── style.css # 样式表 ├── Cargo.toml # Rust 依赖配置 ├── config.toml # 运行时配置文件 ├── start-network-a.bat # 网络 A 启动脚本 ├── start-network-b.bat # 网络 B 启动脚本 └── README.md # 本文档 ``` ### 核心模块说明 | 模块 | 文件 | 职责 | |------|------|------| | 配置管理 | `config.rs` | 解析配置文件,提供 inbox/outbox 路径 | | 消息模型 | `message.rs` | 定义消息结构和序列化 | | 数据存储 | `storage.rs` | SQLite 数据库操作,消息持久化 | | 文件同步 | `sync.rs` | 定时扫描共享文件夹,发现新消息 | | API 服务 | `api.rs` | HTTP REST API 和 WebSocket 处理 | | 前端界面 | `frontend/` | Web UI,消息展示和交互 | ## 系统架构 ``` ┌─────────────────────────────────────────────────────────────────────┐ │ 隔离网络环境 │ ├───────────────────────────────┬─────────────────────────────────────┤ │ 网络 A │ 网络 B │ │ ┌─────────────────┐ │ ┌─────────────────┐ │ │ │ Messenger │ │ │ Messenger │ │ │ │ (Rust 后端) │ │ │ (Rust 后端) │ │ │ │ │ │ │ │ │ │ │ ┌───────────┐ │ │ │ ┌───────────┐ │ │ │ │ │ Web UI │ │ │ │ │ Web UI │ │ │ │ │ │ (浏览器) │ │ │ │ │ (浏览器) │ │ │ │ │ └───────────┘ │ │ │ └───────────┘ │ │ │ └────────┬────────┘ │ └────────┬────────┘ │ │ │ │ │ │ │ ▼ │ ▼ │ │ ┌─────────────────────────────────────────────────────────────┐ │ │ │ 共享文件夹 (Shared Folder) │ │ │ │ ┌──────────────────────────────────────────────────────┐ │ │ │ │ │ messages/ │ │ │ │ │ │ ├── msg-001.msg.json (A 发送的消息) │ │ │ │ │ │ ├── msg-001.bin (附件,如有) │ │ │ │ │ │ ├── msg-002.msg.json (B 发送的消息) │ │ │ │ │ │ └── ... │ │ │ │ │ └──────────────────────────────────────────────────────┘ │ │ │ │ ┌──────────────────────────────────────────────────────┐ │ │ │ │ │ pending/ │ │ │ │ │ │ ├── A/ (A 端临时写入目录) │ │ │ │ │ │ └── B/ (B 端临时写入目录) │ │ │ │ │ └──────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────────────┘ ``` ## 工作原理 ### 消息发送流程(A 发送给 B) ``` ┌──────────┐ ┌──────────┐ ┌──────────────┐ ┌──────────────┐ │ 前端 A │───▶│ API A │───▶│ 共享文件夹 │───▶│ 同步引擎 B │ │ (浏览器) │ │ (Rust) │ │ messages/ │ │ (轮询扫描) │ └──────────┘ └──────────┘ └──────────────┘ └──────────────┘ │ │ │ │ │ 1. POST /api/send/text │ │ │ ────────────────▶ │ │ │ │ │ │ │ │ 2. 创建消息对象 │ │ │ │ from_side="A" │ │ │ │ │ │ │ │ 3. 保存到数据库 │ │ │ │ (SQLite) │ │ │ │ │ │ │ │ 4. 写入共享文件夹 │ │ │ │ ─────────────────▶│ │ │ │ xxx.msg.json │ │ │ │ │ │ │ │ │ 5. 定期轮询检测 │ │ │ │ (500ms) │ │ │ │ │ │ 6. WebSocket 广播新消息 │◀─────────────────│ │ ◀────────────────────────────────────────────────────│ │ │ │ │ │ │ │ 7. 检查 from_side │ │ │ │ != "B" (通过) │ │ │ │ │ │ │ │ 8. 保存到数据库 │ │ │ │ │ │ │ │ 9. WebSocket │ │ │ │ 广播到前端 B │ ``` ### 消息同步机制 采用**定时轮询**方式进行消息同步,而非文件系统监控: 1. **轮询间隔**: 默认 500ms(可通过 `sync_interval_ms` 配置) 2. **扫描目录**: `shared/messages/` 3. **文件过滤**: 只处理 `*.msg.json` 文件 4. **去重处理**: 使用内存 HashSet 记录已处理消息 ID 5. **来源过滤**: 跳过 `from_side` 等于自己的消息 ### WebSocket 实时推送 ``` 后端 前端 │ │ │ 发现新消息 │ │ ─────────────────────────────▶│ │ │ │ { type: "newmessage", │ │ message: {...} } │ │ │ │ 前端收到后更新消息列表 │ │ │ ``` ### 数据流示意 ``` 发送端 接收端 │ │ ▼ ▼ ┌─────────┐ ┌─────────┐ │ Web UI │ │ Web UI │ └────┬────┘ └────┬────┘ │ │ ▼ ▼ ┌─────────┐ POST /api/send/* ┌─────────┐ │ HTTP │──────────────────────▶│ WebSocket│ │ API │ │ 广播 │ └────┬────┘ └────┬────┘ │ │ ▼ ▼ ┌─────────┐ 写入 messages/ ┌─────────┐ │ SQLite │◀───────────────────▶│ SQLite │ │ 本地存储 │ 定期轮询同步 │ 本地存储 │ └────┬────┘ └────┬────┘ │ │ ▼ ▼ ┌─────────────────────────────────────────┐ │ 共享文件夹 (共享存储) │ │ messages/ │ └─────────────────────────────────────────┘ ``` ## 快速开始 ### 1. 编译项目 ```bash cd isolated-messenger cargo build --release ``` ### 2. 配置 编辑 `config.toml` 文件: ```toml # 网络 A 配置 side = "A" shared_folder = "/path/to/shared/folder" display_name = "Alice" ``` 对于网络 B,修改 `side = "B"` ### 3. 设置共享文件夹 **Windows (SMB 共享)**: ```powershell # 创建共享文件夹 New-Item -ItemType Directory -Path "C:\SharedMessenger" New-SmbShare -Name "MessengerShare" -Path "C:\SharedMessenger" -FullAccess Everyone ``` **Linux (Samba)**: ```bash sudo mkdir -p /srv/messenger sudo chmod 777 /srv/messenger # 配置 /etc/samba/smb.conf ``` ### 4. 运行 ```bash # 网络 A ./isolated-messenger --config config.toml # 网络 B (在另一台机器上) ./isolated-messenger --config config.toml ``` 或使用启动脚本: ```powershell # 网络 A start-network-a.bat # 网络 B start-network-b.bat ``` ### 5. 访问 Web 界面 打开浏览器访问 `http://localhost:3000` ## 配置说明 | 参数 | 说明 | 默认值 | |------|------|--------| | `side` | 网络端标识 (A 或 B) | "A" | | `port` | Web 服务端口 | 3000 | | `local_data_dir` | 本地数据目录 | "./data" | | `shared_folder` | 共享文件夹路径 | "./shared" | | `display_name` | 用户显示名称 | "User" | | `sync_interval_ms` | 同步间隔(毫秒) | 500 | | `max_file_size_mb` | 最大文件大小(MB) | 100 | | `encryption_key` | 加密密钥(可选) | None | ## API 接口 ### REST API | 方法 | 路径 | 说明 | |------|------|------| | GET | `/api/messages` | 获取消息列表 | | GET | `/api/messages/:id` | 获取单个消息 | | POST | `/api/send/text` | 发送文字消息 | | POST | `/api/send/image` | 发送图片 | | POST | `/api/send/file` | 发送文件 | | GET | `/api/download/:filename` | 下载附件 | | GET | `/health` | 健康检查 | ### WebSocket 连接地址: `ws://localhost:3000/ws` 消息格式: ```json { "type": "newmessage", "message": { "id": "msg-xxx", "from_side": "A", "content": { "type": "text", "content": "Hello!" }, "timestamp": "2024-01-01T12:00:00Z" } } ``` ## 安全建议 1. **网络隔离**: 确保两个网络环境物理隔离,仅通过共享文件夹连接 2. **访问控制**: 对共享文件夹设置适当的访问权限 3. **加密**: 启用消息加密功能,设置 `encryption_key` 4. **审计**: 定期检查消息日志和传输记录 ## 故障排查 ### 消息无法发送 1. 检查共享文件夹路径是否正确 2. 确认文件夹读写权限 3. 查看后端日志错误信息 ### 消息延迟或不显示 1. 检查 `sync_interval_ms` 配置是否合适 2. 确认 WebSocket 连接正常(查看浏览器控制台) 3. 检查 `shared/messages/` 目录是否有新消息文件 4. 查看后端日志确认消息是否被正确处理 ### 文件传输失败 1. 检查文件大小是否超过限制 2. 确认磁盘空间充足 3. 验证文件路径权限 ### WebSocket 连接问题 1. 打开浏览器开发者工具(F12) 2. 查看 Network 标签页的 WebSocket 连接状态 3. 查看 Console 标签页的错误信息 ## 技术栈 - **后端**: Rust + Axum + Tokio - **前端**: 原生 JavaScript + CSS - **数据库**: SQLite - **通信**: WebSocket + 定时轮询 ## 许可证 MIT License