Synclan:一个基于局域网的即时通讯式文件传输工具

110 阅读6分钟

我做了一款基于局域网的“飞书体验”文件传输工具 —— Synclan

TL;DR: 这是一个不需要互联网、不需要第三方服务器、甚至不需要在接收端安装 App 的局域网 IM 式文件传输工具。桌面端开启服务,其他设备(手机/电脑)浏览器扫码即可像聊飞书一样互相传文件、发富文本和 Markdown。

截屏2026-07-25 15.19.11.png

🎯 为什么开发 Synclan?

平时工作和生活中,经常会遇到设备之间传输文件的场景:

  • 公司电脑之间快速传资料/截图
  • 家里的电脑互传照片
  • 临时给另一台设备发送文件
  • 不希望文件经过第三方服务器

目前优秀的局域网传输工具有很多,比如 LocalSendAirDrop 等。其中 LocalSend 是一个非常优秀的开源项目,它解决了不同平台之间快速传文件的问题。

但在实际高频使用中,我发现了两个明显的场景痛点:

  1. 只有“单次传输”,没有“沟通上下文”

    LocalSend 的逻辑更偏向于“选择文件 ➔ 发送 ➔ 接收”。而在我的日常使用中,有时候希望的不只是发送一个文件,而是:

    • 先沟通一下发送什么
    • 发送一些说明文字
    • 连续发送多个文件
    • 查看之前发送过的内容

    这更接近即时通讯(IM)工具的使用方式。

  2. 客户端安装门槛

    LocalSend 需要在参与通信的设备上安装对应客户端。对于一些临时设备或不方便安装软件的场景,并不是特别方便。

所以我的诉求很简单:“打开应用,发现设备,像聊天一样交换内容。”

另外,长期使用飞书后,我认为它在消息输入和展示(富文本编辑、快捷键操作、图片与附件结合)上的细节处理得非常成熟。许多工具只实现了功能,而飞书更关注用户如何自然地完成动作。因此在设计 Synclan 时,我希望能将现代 IM 的优异体验带入局域网通信工具中。


核心传输工具对比

功能特性微信 / 飞书AirDropLocalSendSynclan
通信机制云端服务器局域网/蓝牙局域网纯局域网
交互模式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、图片、视频以及文件消息。

截屏2026-07-25 15.31.08.png

截屏2026-07-25 15.33.48.png

相比传统 IM 中包含发送中、发送成功、失败、已读、未读等复杂状态流转,Synclan 仅关注消息的传递与展示,减少状态维护成本,同时降低系统复杂度。

1. 参考飞书设计的 Lexical 富文本输入框

为了实现更接近现代 IM 的输入体验,Synclan 基于 Lexical 实现了一套富文本编辑器:

截屏2026-07-25 15.42.04.png

  • 功能支持:文本格式化、Markdown 快捷输入、Emoji、代码高亮、图片粘贴、快捷键操作与富文本解析。
  • 文件拖拽:界面支持直接拖入文件或添加附件。
  • 开发难点:攻克了编辑器状态管理、自定义 Node、图片附件与消息数据关联、Markdown 转换等细节,最终达到“输入内容 ➔ 直接发送 ➔ 对方看到完整消息”的顺畅体验。

2. 大文件分片上传 (Chunked Upload)

文件保存于本机配置的资源目录中,不经过第三方服务器。

截屏2026-07-25 15.44.16.png

为了提升传输稳定性,系统支持自动切片机制: 大文件 ➔ 分块 (Chunks) ➔ 服务端接收 ➔ 合并文件

这有效避免了单次请求过大、网络波动导致传输全盘失败或内存占用过高的问题,也为后续扩展断点续传和暂停恢复奠定了基础。

3. 设备发现与 Web 扫码访问

自动识别局域网内部设备,同时提供二维码与网页访问能力。

截屏2026-07-25 15.45.41.png

截屏2026-07-26 15.23.08.png

非常适合临时电脑、不方便安装客户端的设备或移动端浏览器直接使用。

截屏2026-07-25 15.48.17.png

Unknown.png

4. 数据存储与开放 API

数据保存在本地的 SQLite 数据库和本地资源目录中,支持数据库加密HTTPS自签名证书

后端集成了 OpenAPI 文档,启动后访问 http://127.0.0.1:53317/api/docs 即可进行二次开发与扩展。

截屏2026-07-25 15.49.01.png

截屏2026-07-25 15.49.48.png


🧗 开发踩坑与经验总结

  1. Tauri 多端资源管理:由于同时需要支持桌面原生 UI 与 Web 浏览器访问,两套前端资源的构建策略、静态资源加载与打包路径需要仔细设计与分发。
  2. 局域网 HTTPS 兼容:自签名证书在不同操作系统(如 macOS Keychain 与 Windows 证书管理)以及各家浏览器策略上有很大差异,适配过程踩了不少坑。

🗺️ 后续计划 (Roadmap)

  • 文件断点续传与更细粒度的传输状态展示
  • 支持更多消息类型
  • 更完善的设备与权限控制机制
  • 更加安全的通信防护
  • 跨平台及移动端体验进一步优化

📝 写在最后

开发 Synclan 不仅仅是为了做一个小工具,更是一次贯穿全栈的技术实践:涉及 React 前端、Tauri 桌面应用、Rust 后端服务、局域网网络通信、大文件传输与富文本编辑器 等多个领域的融合。

从最初的构想到现在能在多个设备间流畅通信,过程非常有意思。如果你也有类似的局域网传输和沟通需求,欢迎试用并提出建议!