LocalSend 跨平台局域网文件共享实战指南:网络配置、隐藏启动参数与源码级工作原理
2026/9/6 19:14:47 网站建设 项目流程

LocalSend 跨平台局域网文件共享实战指南:网络配置、隐藏启动参数与源码级工作原理

【免费下载链接】localsendAn open-source cross-platform alternative to AirDrop项目地址: https://gitcode.com/GitHub_Trending/lo/localsend

LocalSend 是一个免费、开源的跨平台文件传输应用,允许设备在同一局域网内无需互联网即可安全分享文件与消息。本文以仓库中高棉语版说明文档 support/readme/README_KM.md(其内容与主 README 保持同步)为主体,完整覆盖下载渠道、防火墙端口配置、便携模式、--hidden启动参数等实操要点,并结合 Rust 核心库与 Flutter 应用源码,深入解析设备发现、自签名 HTTPS 证书与设置持久化的实现细节,帮助读者既能正确部署 LocalSend,也能理解其底层工作机制。

项目定位:不依赖外部服务器的局域网传输

LocalSend 是一个跨平台应用,通过 REST API 与 HTTPS 加密实现设备之间的安全通信。与其他依赖外部服务器的传输类应用不同,LocalSend 既不需要互联网连接,也不需要任何第三方中继服务器——数据全程在局域网内点对点传输,这使得它成为本地文件共享场景中快速且可靠的解决方案(参见 support/readme/README_KM.md 的"About"部分与主文档 README.md)。

从源码结构看,项目采用三层架构支撑这一目标:

  • 核心协议层:packages/core 是 Rust 编写的核心库,包含设备发现(discovery)、HTTPS 服务器与客户端(http)、加密(crypto)、组播(multicast)与 WebRTC 模块;
  • Flutter 应用层:app 目录是基于 Flutter 的跨平台前端(含 pubspec.yaml),通过 packages/localsend_isolates 以 Rust isolate 方式桥接核心库;
  • CLI 工具:cli 提供命令行收发文件能力,与 GUI 共享同一套协议实现。

仓库内还维护了 19 种语言的 README 翻译(位于 support/readme),高棉语版(ភាសាខ្មែរ)即本文依据的 support/readme/README_KM.md。

下载与安装:渠道选择与平台兼容性

官方建议从应用商店或包管理器安装,因为应用本身没有自动更新功能。各平台可用渠道如下(引自 support/readme/README_KM.md 的 Download 表格,具体安装包地址以仓库 releases 页面为准):

WindowsmacOSLinuxAndroidiOSFire OS
WingetApp StoreFlathubPlay StoreApp StoreAmazon
ScoopHomebrewNixpkgsF-Droid
ChocolateyDMG 安装包SnapAPK 直装
EXE 安装包AUR
Portable ZIPTAR
DEB
AppImage

平台兼容性与依赖(原文档 Compatibility 表格,完整保留):

平台最低版本备注
Android5.0-
iOS12.0-
macOS11 Big Sur旧系统需借助 OpenCore Legacy Patcher 2.0.2(参考 issue #1005)
Windows10最后一个支持 Windows 7 的版本是 v1.15.4,未来可能有新版本回移支持
LinuxN.A.GNOME 依赖xdg-desktop-portalxdg-desktop-portal-gtk;KDE 依赖xdg-desktop-portalxdg-desktop-portal-kde

网络配置:防火墙端口与 AP 隔离

大多数情况下 LocalSend 开箱即用,但如果发送或接收文件受阻,需要检查两处网络配置。

防火墙规则

原文档给出的标准防火墙配置表如下,应直接照此配置:

流量类型协议端口动作
入站(Incoming)TCP, UDP53317允许
出站(Outgoing)TCP, UDP任意允许

这个 53317 端口在源码中是硬编码的默认值:CLI 模块在 cli/src/storage/config.rs#L34 中定义const DEFAULT_PORT: u16 = 53317;(配置文件注释示例见 cli/src/storage/config.rs#L27),cli/src/main.rs#L22 也明确标注"HTTP 服务器端口,默认取自 config.toml,否则为 53317"。启动后 CLI 的横幅会按该端口拼接直连地址,如https://192.168.0.1:53317,可参考 cli/src/banner.rs#L88-L124 的测试用例了解 IPv4/IPv6 地址的渲染规则(IPv6 会带中括号)。

关闭路由器的 AP 隔离

确认路由器已关闭 AP isolation(AP 隔离)。该选项通常默认关闭,但部分路由器(尤其是访客网络 guest network)可能默认开启——一旦开启,设备之间的直接通信会被路由器禁止,表现为"互相看不到对方设备"。

高级用法:Portable Mode 与隐藏启动

Portable Mode(便携模式)

v1.13.0起支持便携模式:在可执行文件(executable)所在的目录中创建一个名为settings.json的文件,该文件可以为空;应用检测到它后,便会改用该文件持久化所有设置,而不再写入系统默认位置。这意味着把整个应用目录拷走即可连同偏好设置一起迁移。

源码层面,该功能由 app/lib/util/shared_preferences/shared_preferences_portable.dart 实现:SharedPreferencesPortable继承自SharedPreferencesFile(见 app/lib/util/shared_preferences/shared_preferences_file.dart),其中buildSettingsPath(第 44–50 行)优先取Platform.resolvedExecutable的父目录拼接settings.json;当可执行路径无法解析(例如运行在 ImDisk 虚拟 RAM 盘上会触发TypeError)时,回退到当前工作目录,并有@visibleForTesting标注便于测试。

隐藏启动--hidden

v1.15.0起,若要启动时应用只驻留系统托盘而不显示主窗口,使用--hidden参数,例如:

localsend_app.exe --hidden

需要注意版本差异:在 v1.14.0 及更早版本中,应用是否隐藏启动由"autostart 已设置 + 隐藏启动选项被开启"两个条件隐式决定;v1.15.0 起改为显式监听--hidden命令行参数。这一行为变更记录于 app/assets/CHANGELOG.md#L157("now listens to--hiddenparameter instead ofautostart")。

实现上,参数常量startHiddenFlag = '--hidden'定义在 app/lib/util/native/autostart_helper.dart#L9:开启 autostart 时,Linux 会将其写入.desktop自启动项的Exec行、Windows 会写入注册表启动键值(autostart_helper.dart#L13-L48),macOS 则调用原生登录项接口设置最小化启动。Linux 原生入口还会在 C++ 侧再次检查该参数以决定首窗口是否隐藏,见 app/linux/my_application.cc#L27-L31。

工作原理:组播发现 + 设备级自签名 HTTPS

原文档"How It Works"部分指出:LocalSend 使用一种安全通信协议,允许设备通过 REST API 相互通信;所有数据经 HTTPS 安全传输,TLS/SSL 证书在每台设备上即时本地生成,无需任何外部 CA。协议细节的完整定义位于独立的 LocalSend Protocol 仓库(仓库文档中给出的协议文档入口),这里从源码印证其关键机制。

设备发现:UDP 组播

发送端与接收端在局域网内互相"发现"依赖组播 UDP 广播,实现在 packages/core/src/multicast:模块基于tokio::net::UdpSocket构建组播套接字(multicast/mod.rs#L20、multicast/socket.rs#L94-L154),并通过receive_loop(第 330 行起)持续接收邻居设备的通告。发现的设备缓存与合并逻辑在 packages/core/src/discovery/store.rs(其中第 274 行可见默认端口53317参与设备条目构造),该机制正是前文防火墙表中要求放行 UDP 的原因——只开 TCP 会导致设备列表始终为空。

安全通信:RSA-2048 自签名证书与指纹识别

每台设备的 HTTPS 身份由本地生成的自签名证书承载,核心函数是 packages/core/src/crypto/cert.rs 中的generate_self_signed(第 32–56 行),其设计要点(直接来自源码注释):

  • RSA-2048 密钥对,与 Flutter 应用历史上在 Dart 侧生成的证书保持格式兼容;
  • 证书CN=LocalSend User不带 SAN——对等设备纯粹依靠证书的 SHA-256 指纹相互识别,证书名不携带身份信息;
  • 有效期沿用 rcgen 默认(1975–4096 天),证书事实上永不过期、无需因时间原因轮换;
  • 输出的SelfSignedCert结构同时包含 PEM 编码的私钥(PKCS#8)、公钥(SPKI)、自签名证书与指纹(cert.rs#L9-L19)。

验证逻辑verify_cert_from_cert(第 75 行起)依次校验签名、时间有效性与(如提供)公钥匹配,配合应用层的"已配对设备"机制(CLI 侧持久化在 cli/src/storage/paired.rs),保证重连同一设备时不会反复提示信任。

此外,仓库测试目录 packages/core/tests 中包含v2_tls_pinning.rs(TLS 证书固定验证)、multicast.rs(组播发现)等集成测试,可作为上述机制可运行性的直接证据。

从源码编译与本地开发(Getting Started)

按 support/readme/README_KM.md 的 Getting Started 章节,从源码运行 LocalSend 的步骤为:

  1. 安装 Flutter:可直装,也可使用 fvm(版本要求见下文);
  2. Clone LocalSend 仓库(如需:git clone https://gitcode.com/GitHub_Trending/lo/localsend);
  3. cd app进入应用目录;
  4. flutter pub get拉取依赖;
  5. flutter run启动应用。

Flutter 版本约束(重要):文档特别提醒——LocalSend 目前要求特定的 Flutter 版本(原高棉语文档表述为"较旧的 Flutter 版本"),安装问题往往源于本机全局 Flutter 版本与要求不一致。仓库在根目录的 .fvmrc 中固定了开发版本:

{ "flutter": "3.41.9" }

因此建议安装fvm后统一使用fvm flutter代替flutter执行所有命令,fvm会按 .fvmrc 自动选用 3.41.9,保证环境一致性。多平台编译脚本集中在 support/scripts(如compile_android_apk.shcompile_windows_msix_store.ps1等),各平台的打包配置则分别位于 app/android、app/ios、app/macos、app/windows、app/linux 之下。

翻译与贡献

高棉语 README 本身即"翻译贡献"的成果。原文档 Contributing 章节给出两条路径:

  • 推荐:通过 Weblate 平台管理翻译(LocalSend app 项目);
  • 备选:Fork 仓库后手工添加翻译。

翻译文件位于 app/assets/i18n 目录,编辑_missing_translations_<locale>.json(缺失词条清单)或strings_<locale>.i18n.json即可新增/更新译文。目录中每个语言既有完整词条文件(如km.jsonzh-CN.json),也有对应的缺失清单(如 _missing_translations_ko.json)。仓库中还有自动化生成的 Dart 文案绑定(app/lib/gen/strings_ko.g.dart 等)以及 i18n 完整性测试 app/test/unit/i18n_test.dart 用于校验各语言翻译状态。

一条明确的翻译规则(原文加粗强调):@开头的行是注释,不要翻译——它们不参与任何运行时逻辑,仅用于为译者提供文件说明或上下文。

其他贡献方式:

  • 修 Bug:创建 pull request,需清晰描述问题与修复方式;
  • 改进建议:先在 GitHub 提 issue 讨论必要性。

更完整的贡献规范(含分发渠道说明)见 CONTRIBUTING.md。

故障排查(Troubleshooting)

原文档附带的排查表完整保留如下,建议按"现象 → 发送端平台 / 接收端平台 → 对策"三列对照处理:

问题Platform(发送)Platform(接收)解决方案
看不到设备任意任意确认路由器已关闭 AP-Isolation。若其开启,设备间连接将被禁止。
看不到设备任意Windows将当前网络类型设为"专用"(Private)。网络为"公用"时 Windows 限制更严格。
看不到设备macOS, iOS任意可尝试在系统设置的"隐私(Privacy)"中切换"本地网络(Local Network)"权限。
速度太慢任意任意改用 5 GHz 频段;在两台设备上都关闭加密(encryption)。
速度太慢任意Android已知问题,根因在 Flutter 插件 saf_stream 的实现(上游 issue #4)。

补充说明:表中"关闭加密"指的是应用设置中可选的传输层加密选项(LocalSend 的 HTTPS 始终启用,此选项影响文件内容是否额外加密),若网络环境不可信不建议关闭;"看不到设备"问题可结合前文组播发现机制理解——绝大多数情况是 UDP 53317 被防火墙拦截或 AP 隔离开启所致。

小结

通过这篇指南,读者应当能够:正确选择各平台的安装渠道并理解 support/readme/README_KM.md 给出的兼容性边界;按 TCP/UDP 53317 的标准规则配置防火墙并排除 AP 隔离;使用settings.json启用 Portable Mode、用--hidden参数实现托盘静默启动;并从 packages/core 源码理解 LocalSend"组播 UDP 发现设备 + 设备级 RSA-2048 自签名 HTTPS 证书 + SHA-256 指纹互认"的核心安全模型;最后按 .fvmrc 固定版本(Flutter 3.41.9 + fvm)从源码编译并参与多语言翻译贡献。

【免费下载链接】localsendAn open-source cross-platform alternative to AirDrop项目地址: https://gitcode.com/GitHub_Trending/lo/localsend

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询