经典局域网聊天软件飞秋 (FeiQ) 的现代跨平台增强版本,兼容飞鸽传书 (IP Messenger) 协议。
- 文本消息收发、96 种 QQ 风格表情内联渲染
- 窗口抖动 (Knock)
- 离线消息(上线后自动送达)
- Enter / Ctrl+Enter 发送切换
- 单文件传输,支持大文件 (>100GB)
- 实时进度显示、取消/续传
- 拖拽发送
- 64KB 分块传输
- 上传/下载限速(可配置 KB/s)
- 中继文件传输(跨网络通过 WebSocket 二进制隧道)
- 密码保护的文件共享目录浏览
- 无服务器 P2P 聊天室,无限创建群组
- 群发消息、群文件共享、群公告、P2P 群组分发
- 群主权限控制、群设置管理
- 自建 Rust WebSocket 中继服务器
feiq-relay - 三种连接模式:纯局域网 / 纯中继 / 混合模式
- 跨子网自动去重 (MAC 地址索引)
- 离线消息 24h TTL 服务器端队列
- feiq++ 间 ECDH (x25519) + AES-256-GCM 端到端加密
- 密封消息 (阅后即焚)
- 随机数前缀防重放
- 隐身模式(全局不可见)
- 好友分组树、自定义备注名/别名编辑、个性签名
- 拼音搜索联系人(支持首字母和全拼)
- 黑名单过滤
- 名称/IP 搜索、自定义广播网段
- 个人头像(SHA256 哈希 + 网络传输)
- SQLite 持久化存储、无限滚动加载历史
- 全文搜索、日期分隔线、JSON 导出/导入
- 明/暗/自动/自定义主题 (CSS 变量 + Tailwind + 运行时注入)
- 系统原生通知 + Dock/Taskbar 未读角标
- 系统托盘快捷操作
- 字体自定义(族 + 大小)
- 涂鸦绘画工具(Canvas 自由绘制)
| 平台 | 状态 |
|---|---|
| macOS | ✅ |
| Windows | ✅ |
| Linux | ✅ |
| 层 | 技术 | 说明 |
|---|---|---|
| 协议引擎 | Rust + tokio | IPMSG v9 完整协议实现 |
| 编码 | encoding_rs (Mozilla) | 纯 Rust GBK/UTF-8 |
| 加密 | ring 0.17 | AES-256-GCM + ECDH |
| 存储 | rusqlite (bundled) | SQLite 内嵌,无系统依赖 |
| 桌面壳 | Tauri 2 | ~5MB 二进制,三平台原生 |
| 前端 | React 18 + TypeScript | Vite 构建 |
| 样式 | Tailwind CSS 3 | 工具类优先 |
feiq-plus-plus/
├── packages/
│ ├── feiq-core/ # Rust: 协议引擎 + 网络 + 存储 + 加密
│ │ └── src/
│ │ ├── protocol/ # IPMSG 协议常量、类型、编解码、解析链
│ │ ├── network/ # UDP/TCP/Relay 通信、加密
│ │ ├── engine/ # 引擎控制器 + 事件系统 + 文件任务
│ │ ├── model/ # 联系人簿 (线程安全)
│ │ └── storage/ # SQLite 聊天记录 + INI 配置
│ ├── feiq-app/ # Tauri 2 桌面壳
│ │ └── src/ # commands (36), events, state, tray
│ ├── feiq-relay/ # Rust WebSocket 中继服务器
│ │ └── src/ # server, main, lib
│ └── feiq-gui/ # React 前端
│ └── src/
│ ├── components/ # Sidebar, ChatPanel, MessageBubble, InputArea,
│ │ # EmojiPicker, SettingsDialog, CreateGroupDialog,
│ │ # FileTransferPanel, DoodleDialog, RemoteFileBrowser
│ └── stores/ # Zustand: contactStore, messageStore,
│ # fileTransferStore, groupStore, typingStore
├── docs/
│ ├── PLAN.md # 完整实现计划
│ ├── phase-execution-plan.md # 详细执行方案
│ ├── relay-server-design.md # 中继服务器技术方案
│ └── RELEASE_NOTES_v0.1.0.md # 发布说明
├── README.md # 本文件
└── Cargo.toml # Rust workspace
# 克隆项目
git clone https://github.com/lulyon/feiq-plus-plus.git
cd feiq-plus-plus
# 安装前端依赖
cd packages/feiq-gui && npm install && cd ../..
# 开发模式 (前端热更新 + Rust 后端)
cargo tauri dev
# 仅编译 Rust 核心库
cargo build --workspace
# 运行全部测试 (200 Rust + 18 TypeScript)
cargo test --workspace
npm --prefix packages/feiq-gui test
# 生产构建 + 打包
cargo tauri build首次启动会自动创建 ~/.feiq_setting.ini,兼容原飞秋配置格式:
[user]
name = 你的名字
host = 你的主机名
[network]
custom_group = 192.168.74.|192.168.82.
[app]
send_by_enter = 1完全实现 IP Messenger Draft-9 (v9) 协议,可与以下客户端互通:
| 客户端 | 文本 | 文件 | 表情 | 抖动 |
|---|---|---|---|---|
| 飞鸽传书 (IPMSG) | ✅ | ✅ | — | — |
| 飞秋 (FeiQ) Windows | ✅ | ✅ | ✅ | ✅ |
| 飞秋 (FeiQ) Mac | ✅ | ✅ | ✅ | ✅ |
| feiq++ ↔ feiq++ | ✅ | ✅ | ✅ | ✅ |
feiq++ 间额外支持端到端加密通信。
feiq++ 在协议中使用的版本字符串:
feiq_plus_plus#128#MAC地址#0#0#0#1#9
通过此标识可区分 feiq++ 和对端是否支持加密。
详见 docs/PLAN.md 获取完整实现计划和技术决策记录。
cargo test --workspace # 全部 200 个 Rust 测试
cargo test -p feiq-core # 仅核心库测试
npm --prefix packages/feiq-gui test # 前端 18 个 TypeScript 测试Rust 源码: ~11,000 行 (35+ 文件, 3 crates)
React/TS: ~3,000 行 (11 组件 + 5 stores)
测试覆盖: 218 个测试 (200 Rust + 18 TS), 全部通过
IPC 命令: 36 个
- 中继文件传输: WebSocket 二进制隧道,支持跨网络文件收发,移除中继下载守卫
- 文件共享: 密码保护共享目录浏览 (
browse_shared_folder),兼容 IPMSG PASSWORDOPT - 传输限速: 可配置文件上传/下载限速 (KB/s),sleep-based pacing
- 输入状态提示:
IPMSG_INPUTING/IPMSG_INPUT_END协议支持,前端 debounce + 5s 自动清除 - 隐身模式: 全局不可见,不广播 BR_ENTRY,不应答 ANSENTRY
- 拼音搜索: 首字母 + 全拼匹配,
pinyincrate 集成 - 个人头像:
IPMSG_GETAVATAR/IPMSG_SENDAVATAR协议扩展,SHA256 哈希交换 - 主题增强: 自定义主题
CustomTheme结构体,运行时 CSS 变量注入 - 字体自定义:
--font-family/--font-sizeCSS 变量,配置持久化 - 涂鸦工具: HTML5 Canvas 自由绘制 (画笔/橡皮擦/颜色/线宽/撤销)
- 群组增强: 群文件共享、群公告、群主权限控制 (owner_ip + settings)
- BR_ABSENCE: 名称/状态变更检测,兼容飞秋旧版客户端
- READMSG/ANSREADMSG: 密封消息已读回执处理
- 审计修复: AES-GCM nonce 重用、中继离线消息丢失、引擎停止泄漏等 17 个关键问题修复
本项目参考了以下开源项目:
- 飞鸽传书 (IP Messenger) — BSD License, 白水啓章 (H.Shirouzu), 1996
- 飞秋 (FeiQ) for Mac — GPL, 开源项目