首页
/
行业洞察
/
正文
INDUSTRY INSIGHT · 深度
LocalSend 技术解析:基于 LAN 的无网文件传输实现、防火墙配置与便携模式源码剖析
📅 2026/9/6 19:22:35
✍️ 爱科研究院
👁 阅读 3,247
LocalSend 技术解析基于 LAN 的无网文件传输实现、防火墙配置与便携模式源码剖析【免费下载链接】localsendAn open-source cross-platform alternative to AirDrop项目地址: https://gitcode.com/GitHub_Trending/lo/localsend本文以 LocalSendAirDrop 的开源替代品的泰语版官方 README 为骨架结合开源仓库源码完整讲解这个跨平台应用的核心定位、各平台下载渠道、防火墙与路由器配置要求、便携模式Portable Mode与--hidden托盘启动参数的源码级实现原理以及如何从源码构建该应用。读完之后你将能够正确配置 LocalSend 的网络环境、理解其设备发现与 HTTPS 自签名证书的底层机制并独立完成从源码到运行的完整构建流程。一、LocalSend 是什么LocalSend 是一款开源跨平台应用让文件与消息可以在局域网内的设备之间安全传输全程不需要互联网连接也不依赖任何第三方服务器。与其他依赖外部服务器的传输/消息类应用不同LocalSend 基于 REST API 和 HTTPS 加密实现设备间通信是一款面向本地网络LAN的快速、可靠的传输方案。从仓库结构看整个项目由三大部分组成Flutter 应用位于 app/ 目录包含 Android、iOS、macOS、Windows、Linux 各平台壳层业务代码在 app/lib/Rust 核心库位于 packages/core/实现协议、多播发现、HTTPS 服务、加密与 WebRTC 等底层能力Flutter ↔ Rust 桥接层位于 packages/localsend_isolates/通过 Rust 隔离进程isolates调用核心能力并附带 CLI 工具 cli/。仓库根目录下的 Cargo.toml 定义了多包工作区pubspec.yaml 与 app/pubspec.yaml 则管理 Dart 侧依赖。二、下载与分发渠道由于应用内没有自动更新auto-update功能官方推荐从应用商店或包管理器下载以便获得持续维护的版本。各平台的分发渠道如下表WindowsmacOSLinuxAndroidiOSFire OSWingetApp StoreFlathubPlay StoreApp StoreAmazonScoopHomebrewNixpkgsF-DroidChocolateyDMG 安装器SnapAPKEXE 安装器AURPortable ZIP 便携版TAR / DEB / AppImage均取自最新版 Release几个值得注意的渠道细节Linux 渠道最多除 Flathub、Snap、AUR 外还可从 GitHub Release 获取 TAR、DEB、AppImage 原始发行版其中 TAR/AppImage 正是后面便携模式的典型载体Windows 二进制文件经过代码签名签名策略详见 CODE_SIGNING.md各平台的打包脚本集中在 support/scripts/例如 compile_windows_exe.ps1、compile_mac_dmg.sh、compile_android_apk.sh 等维护者可据此了解各发行版的实际构建方式。三、网络配置防火墙端口与路由器设置大多数情况下 LocalSend 可以开箱即用。但如果你遇到设备互相发现不了或发送/接收失败通常需要在防火墙中放行 LocalSend 的局域网通信。官方给出的防火墙规则如下Traffic Type方向Protocol协议Port端口Action动作Incoming入站TCP, UDP53317Allow允许Outgoing出站TCP, UDPAny任意Allow允许同时请确认路由器上的AP isolationAP 隔离已关闭。该设置通常默认关闭但部分路由器尤其是访客网络会默认开启开启后设备之间的直连通信会被路由器禁止导致设备不可见。端口 53317 的源码依据入站端口 53317 并非随意选择它在 Rust 核心库中是全局统一的默认端口——HTTP 服务端口与 UDP 多播端口是同一个值多播发现模块 packages/core/src/multicast/mod.rs 中定义了pub const DEFAULT_PORT: u16 53317;注释明确写道与默认 HTTP 服务端口相同CLI 工具的默认端口同样来自 cli/src/storage/config.rs 中的const DEFAULT_PORT: u16 53317;且 CLI 支持通过config.toml覆盖该值见 cli/src/main.rs 中--port参数注释 Port of the HTTP server [default: config.toml, else 53317]核心测试 packages/core/src/http/client/url.rs 中的 URL 构造断言也全部基于 53317例如https://192.168.1.1:53317/api/localsend/v2/register。这也解释了防火墙表格的形态入站必须精确放行53317 的 TCP UDPTCP 承载 HTTPS 传输UDP 承载多播发现而出站允许任意端口设备向对端发起连接时可涉及临时端口。设备如何被发现UDP 多播组从 packages/core/src/multicast/mod.rs 的源码可以看出LocalSend 的设备发现机制是只发送、不应答的 UDP 多播广播IPv4 多播组为224.0.0.167。源码注释解释了选这个地址的原因它位于224.0.0.0/24段内因为部分 Android 设备只能在该 IP 段内接收 UDP 多播消息IPv6 多播组为ff12::fd3a:e420是协议 v2.2 之上的 LocalSend 扩展IPv4 仍是基线IPv6 并行广播设备通过周期性发送MulticastMessageV2广播自身且采用突发重发策略源码中ANNOUNCE_DELAYS为 100ms / 500ms / 2000ms 三次因为单条数据报很容易丢失且刚加入网络的设备可能尚未准备好应答真正的应答不走 UDP而是由应用层向广播方发起一次 HTTP register 请求完成确认。发现结果保存在内存设备存储中见 packages/core/src/discovery/store.rs每个DiscoveredDevice以**指纹fingerprint**去重并记录其被确认过的各个通道DeviceChannel及状态。这与 support/docs/ 中的 dependency-hierarchy.svg 所描绘的Flutter 应用层 → isolates 桥接层 → core 核心库依赖关系一起构成了完整的架构视图。四、工作原理REST API 即时生成的自签名 TLS 证书LocalSend 使用一套安全的通信协议设备之间通过 REST API 通信所有数据都通过 HTTPS 传输而 TLS/SSL 证书是在每台设备上即时生成的从而在无需任何 CA 或中央服务器的情况下保证传输安全。自签名证书的生成细节即时生成的实现位于 packages/core/src/crypto/cert.rsgenerate_self_signed()函数生成的设备身份包含一个RSA-2048 密钥对与 Flutter 应用历史上在 Dart 侧生成的证书保持兼容一张自签名 X.509 证书主题 CN 固定为LocalSend User不带 SAN——因为对端设备之间仅凭证书指纹相互识别证书名称不承载任何身份信息一个SHA-256 指纹对证书 DER 编码做哈希大写十六进制即界面上看到的设备指纹fingerprint_from_cert_der()负责计算有效期采用 rcgen 默认值1975 年到 4096 年即证书实际上不会过期无需因时间原因轮换。配对信任的建立则依赖指纹比对packages/core/src/crypto/cert.rs 中的verify_cert_from_pem()/verify_cert_from_der()会依次校验时间有效性、公钥是否匹配Public key mismatch单独报错以便单测、以及签名本身。协议层面的完整规范在独立的 protocol 文档仓库中维护本仓库的 packages/core/ 是其主要参考实现。五、配置进阶便携模式与隐藏启动便携模式Portable Mode自v1.13.0引入。操作方法在可执行文件.exe所在的同一目录创建一个名为settings.json的文件该文件可以是完全空白的文件应用检测到它之后就会把全部设置存到这个文件里而不再写入默认位置用户数据目录。源码印证见 app/lib/util/shared_preferences/shared_preferences_portable.dart/// Custom implementation of SharedPreferencesStorePlatform /// that uses a file named settings.json located next to the executable. /// This is used to for portable mode. class SharedPreferencesPortable extends SharedPreferencesFile { SharedPreferencesPortable() : super(filePath: _getSettingsPathFromExecutable(), beautify: true); }几个实现细节值得注意buildSettingsPath()会把路径解析为可执行文件所在目录 /settings.json通过Platform.resolvedExecutable定位可执行文件但特意做了容错在某些虚拟磁盘例如 ImDisk 内存盘上读取该属性会抛出TypeError导致应用未启动即崩溃因此源码捕获异常后回退到当前工作目录fallbackDirectory对应单测 app/test/unit/util/shared_preferences/shared_preferences_portable_test.dart 验证了settings.json 位于可执行文件旁的路径拼接逻辑如/opt/localsend/settings.json。作为对照默认的持久化路径非便携模式位于 app/lib/provider/persistence_provider.dart例如 Windows 上是%APPDATA%\LocalSend\settings.json。以系统托盘图标方式启动Start Hidden自v1.15.0更新。如果希望应用启动时不显示主窗口、只驻留系统托盘使用--hidden命令行参数localsend_app.exe --hidden版本历史注意在v1.14.0 及更早版本中应用只有同时满足设置了autostart标志且隐藏设置已开启两个条件才会静默启动v1.15.0 起改为直接监听--hidden参数。这一点也被 app/assets/CHANGELOG.md 记录now listens to--hiddenparameter instead ofautostart。各平台的参数解析在源码中都有对应实现Windows/通用 Dart 侧app/lib/util/native/autostart_helper.dart 中定义了const startHiddenFlag --hidden;Linux 原生壳app/linux/my_application.cc 在MyApplication::MyApplication()构造阶段遍历dart_entrypoint_arguments逐一strcmp比对--hidden命中后跳过首窗口创建、仅启动托盘。六、从源码构建Getting Started要从源码编译 LocalSend按以下步骤操作泰语版 README 的完整步骤安装 Flutter可以直接安装也可以使用 fvm 管理版本注意以仓库中.fvmrc指定的版本为准克隆LocalSend仓库运行cd app进入应用目录运行flutter pub get下载依赖运行flutter run启动应用。注意LocalSend 目前要求较旧的 Flutter 版本见 .fvmrc系统安装的 Flutter 与要求版本不一致时可能出现编译问题。为了开发环境一致LocalSend 使用 fvm 管理项目 Flutter 版本——安装 fvm 后请一律用fvm flutter代替flutter执行命令。补充仓库当前 .fvmrc 的内容为{ flutter: 3.41.9 }。此外由于核心库与 isolates 桥接层均为 Rust 编写见 packages/localsend_isolates/rust/完整构建时还需安装 Rust 工具链版本约束见仓库根目录的 rust-toolchain.toml。构建产物命令面向维护者需从app目录执行# Android flutter build apk # 传统 APK flutter build appbundle # Google Play 用的 AppBundle # iOS / macOS flutter build ipa flutter build macos # Windows flutter build windows # 传统 EXE flutter pub run msix:create # 本地 MSIX flutter pub run msix:create --store # 商店就绪 MSIX # Linux flutter build linux appimage-builder --recipe AppImageBuilder.yml # AppImage七、参与贡献LocalSend 欢迎任何形式的贡献主要有两种途径翻译官方翻译托管在 Weblate 平台推荐方式也支持 Fork 仓库后手动添加翻译。翻译文件位于 app/assets/i18n/ 目录编辑_missing_translations_locale.json或strings_locale.i18n.json即可新增或更新翻译。当前仓库中已有zh-CN、ja、ko、ar等 60 余个语言的翻译文件。注意以开头的字段/条目不需要翻译——它们不会在应用中显示仅是给开发者或译者提供上下文说明。翻译产出的 Dart 字符串类由本地化工具生成在 app/lib/gen/如 strings_th.g.dart 即泰语绑定应用通过 app/lib/util/i18n.dart 统一取用文案。Bug 修复与功能改进Bug 修复发现问题后请直接提交 PR并在描述中清晰说明问题与修复方式改进建议如有改进 LocalSend 的想法请先创建 issue 讨论其必要性。更多规范见 CONTRIBUTING.md。八、小结回到泰语版 README 的主线LocalSend 的核心价值在于无互联网、无中心服务器的局域网安全传输其可靠性建立在三个可验证的工程决策之上——全网统一的 53317 端口TCP/UDP 双协议放行、UDP 多播只广播不应答的发现协议224.0.0.167/ff12::fd3a:e420双栈、以及每台设备即时生成的 RSA-2048 自签名证书与 SHA-256 指纹配对机制。配置层面只需一张两行的防火墙规则表、一个空的settings.json便携模式或一个--hidden参数托盘启动即可覆盖绝大多数部署场景。【免费下载链接】localsendAn open-source cross-platform alternative to AirDrop项目地址: https://gitcode.com/GitHub_Trending/lo/localsend创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📌 标签:
工业官网
设计趋势
AI 建站
SEO
获取完整报告 →
RELATED ARTICLES
推荐阅读
2026/9/6 19:22:35
Super Productivity:免费开源的任务管理与时间追踪工具完整指南
2026/9/6 19:22:35
基于 project-layout 的 Go 标准项目布局:目录规范、适用场景与源码级实践指南
2026/9/6 19:17:35
axios 贡献实战指南:代码风格、Conventional Commits、Vitest 测试体系与构建沙箱验证全流程
2026/9/6 20:02:37
基于51单片机的声光电子节拍器:从定时器中断到12864显示
2026/9/6 20:02:37
负反馈放大电路实验:反馈组态、增益测量与常见故障排查
2026/9/6 20:02:37
LiveKit 实时音视频服务器入门:3 步跑通免费的 WebRTC SFU
2026/9/6 20:02:37
agent-skills 接入 Codex 实战:插件安装、@ 调用与清单文件工作机制
2026/9/6 20:02:37
Langchain-Chatchat 大模型应用技术原理:RAG 向量库选型、混合检索与 Agent Function Call 实战
2026/9/6 19:57:37
J-STD-033C标准解读:湿敏元件MSD干燥处理与烘烤参数实操指南
2026/9/6 0:01:31
超人会飞不算本事:系统稳定依赖清晰规则与边界设计
2026/9/6 0:01:31
超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论
2026/9/6 0:01:31
基于CNN的调制信号识别:MATLAB实现时频图分类实战
2026/9/6 0:01:31
超人会飞不算本事:系统稳定依赖清晰规则与边界设计
2026/9/6 0:01:31
超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论
2026/9/6 0:01:31
基于CNN的调制信号识别:MATLAB实现时频图分类实战