我做了一款基于局域网的“飞书体验”文件传输工具 —— Synclan
TL;DR: 这是一个不需要互联网、不需要第三方服务器、甚至不需要在接收端安装 App 的局域网 IM 式文件传输工具。桌面端开启服务,其他设备(手机/电脑)浏览器扫码即可像聊飞书一样互相传文件、发富文本和 Markdown。
- 🔗 项目地址:github.com/1111mp/sync…
- 📦 最新发布:GitHub Releases
🎯 为什么开发 Synclan?
平时工作和生活中,经常会遇到设备之间传输文件的场景:
- 公司电脑之间快速传资料/截图
- 家里的电脑互传照片
- 临时给另一台设备发送文件
- 不希望文件经过第三方服务器
目前优秀的局域网传输工具有很多,比如 LocalSend、AirDrop 等。其中 LocalSend 是一个非常优秀的开源项目,它解决了不同平台之间快速传文件的问题。
但在实际高频使用中,我发现了两个明显的场景痛点:
-
只有“单次传输”,没有“沟通上下文”
LocalSend 的逻辑更偏向于“选择文件 ➔ 发送 ➔ 接收”。而在我的日常使用中,有时候希望的不只是发送一个文件,而是:
- 先沟通一下发送什么
- 发送一些说明文字
- 连续发送多个文件
- 查看之前发送过的内容
这更接近即时通讯(IM)工具的使用方式。
-
客户端安装门槛
LocalSend 需要在参与通信的设备上安装对应客户端。对于一些临时设备或不方便安装软件的场景,并不是特别方便。
所以我的诉求很简单:“打开应用,发现设备,像聊天一样交换内容。”
另外,长期使用飞书后,我认为它在消息输入和展示(富文本编辑、快捷键操作、图片与附件结合)上的细节处理得非常成熟。许多工具只实现了功能,而飞书更关注用户如何自然地完成动作。因此在设计 Synclan 时,我希望能将现代 IM 的优异体验带入局域网通信工具中。
核心传输工具对比
| 功能特性 | 微信 / 飞书 | AirDrop | LocalSend | Synclan |
|---|---|---|---|---|
| 通信机制 | 云端服务器 | 局域网/蓝牙 | 局域网 | 纯局域网 |
| 交互模式 | IM 聊天流 | 弹窗接收 | 接收卡片 | IM 聊天流 |
| 接收端要求 | 需安装客户端 | 仅限 Apple | 需安装客户端 | 免安装(浏览器扫码即用) |
| 文件原画/无压缩 | ❌ (限制较多) | ✅ | ✅ | ✅ |
🛠️ 整体架构设计与技术栈
Synclan 采用了比较特殊的架构:桌面端提供核心服务,浏览器端无需安装即可访问。
+-----------------------------------------------------------+
| Synclan Desktop App |
| |
| +--------------------+ +----------------------------+ |
| | Tauri 2.0 (GUI) | | Rust Core (Backend) | |
| +--------------------+ | - Axum (HTTP / File Server)| |
| | - Socket.IO (Real-time) | |
| | - SQLite (Local Data) | |
| +----------------------------+ |
+-----------------------------------------------------------+
▲
│ LAN (HTTP/WS)
+-------┴-------+
| |
+--------------+ +---------------+
| Mobile Web | | PC Browser |
+--------------+ +---------------+
启动 Synclan 桌面端后,它会同时提供 HTTP 服务、Socket.IO 实时通信服务、Web 页面资源以及文件访问服务。其他设备只需要在浏览器访问 http://设备IP:53317 即可加入,不需要注册账号、部署服务器或安装客户端。
技术栈选型
- 前端:React + TypeScript + Tailwind CSS + Shadcn/ui,负责页面展示、消息渲染、文件选择与状态管理。
- 桌面端:Tauri 2.0。相比 Electron,体积更小、内存占用更低,且能高效调用 Rust 能力。
- 后端:Rust (Axum + Socket.IO + SQLx + SQLite)。Axum 负责 HTTP API、文件上传与设备管理;Socket.IO 负责实时消息通信、在线状态与消息推送。
✨ 亮点功能与消息系统设计
消息系统是 Synclan 的核心之一,目前支持普通文本消息、Markdown、图片、视频以及文件消息。
相比传统 IM 中包含发送中、发送成功、失败、已读、未读等复杂状态流转,Synclan 仅关注消息的传递与展示,减少状态维护成本,同时降低系统复杂度。
1. 参考飞书设计的 Lexical 富文本输入框
为了实现更接近现代 IM 的输入体验,Synclan 基于 Lexical 实现了一套富文本编辑器:
- 功能支持:文本格式化、Markdown 快捷输入、Emoji、代码高亮、图片粘贴、快捷键操作与富文本解析。
- 文件拖拽:界面支持直接拖入文件或添加附件。
- 开发难点:攻克了编辑器状态管理、自定义 Node、图片附件与消息数据关联、Markdown 转换等细节,最终达到“输入内容 ➔ 直接发送 ➔ 对方看到完整消息”的顺畅体验。
2. 大文件分片上传 (Chunked Upload)
文件保存于本机配置的资源目录中,不经过第三方服务器。
为了提升传输稳定性,系统支持自动切片机制: 大文件 ➔ 分块 (Chunks) ➔ 服务端接收 ➔ 合并文件
这有效避免了单次请求过大、网络波动导致传输全盘失败或内存占用过高的问题,也为后续扩展断点续传和暂停恢复奠定了基础。
3. 设备发现与 Web 扫码访问
自动识别局域网内部设备,同时提供二维码与网页访问能力。
非常适合临时电脑、不方便安装客户端的设备或移动端浏览器直接使用。
4. 数据存储与开放 API
数据保存在本地的 SQLite 数据库和本地资源目录中,支持数据库加密、HTTPS 及自签名证书。
后端集成了 OpenAPI 文档,启动后访问 http://127.0.0.1:53317/api/docs 即可进行二次开发与扩展。
🧗 开发踩坑与经验总结
- Tauri 多端资源管理:由于同时需要支持桌面原生 UI 与 Web 浏览器访问,两套前端资源的构建策略、静态资源加载与打包路径需要仔细设计与分发。
- 局域网 HTTPS 兼容:自签名证书在不同操作系统(如 macOS Keychain 与 Windows 证书管理)以及各家浏览器策略上有很大差异,适配过程踩了不少坑。
🗺️ 后续计划 (Roadmap)
- 文件断点续传与更细粒度的传输状态展示
- 支持更多消息类型
- 更完善的设备与权限控制机制
- 更加安全的通信防护
- 跨平台及移动端体验进一步优化
📝 写在最后
开发 Synclan 不仅仅是为了做一个小工具,更是一次贯穿全栈的技术实践:涉及 React 前端、Tauri 桌面应用、Rust 后端服务、局域网网络通信、大文件传输与富文本编辑器 等多个领域的融合。
从最初的构想到现在能在多个设备间流畅通信,过程非常有意思。如果你也有类似的局域网传输和沟通需求,欢迎试用并提出建议!
- ⭐️ GitHub 项目地址:1111mp/synclan
- 📦 最新版下载试用:GitHub Releases