
LocalSend 开源跨平台局域网文件共享工作原理、网络配置与源码级实战指南【免费下载链接】localsendAn open-source cross-platform alternative to AirDrop项目地址: https://gitcode.com/GitHub_Trending/lo/localsendLocalSend 是一款免费开源的跨平台应用允许你在局域网内与周边设备安全地共享文件和消息全程无需互联网连接。本文基于项目官方文档捷克语版 README 及其对应的 README.md结合仓库中 Rust 核心协议实现packages/core与 Flutter 应用层源码app/lib系统讲解 LocalSend 的分发渠道、兼容性与网络配置、可移植模式、--hidden参数、自签名 TLS 证书与设备指纹机制以及从源码编译运行的完整流程。读完后你将能够独立完成 LocalSend 的部署、防火墙放行、便携化使用并理解其无服务器、端到端加密架构在源码中的落地方式。项目定位不依赖任何第三方服务器的局域网传输LocalSend 是一款多平台应用通过 REST API 与 HTTPS 加密实现设备间的安全通信。与其他依赖外部中转服务器来中转消息的传输应用不同LocalSend 不要求互联网连接也不涉及任何第三方服务器——所有通信都直接发生在局域网LAN内的设备之间。这使其成为本地文件投递的快速、可靠方案无互联网依赖数据不出局域网适合内网隔离环境、办公场景与隐私敏感场景多平台对等Android、iOS、macOS、Windows、Linux、Fire TV OS 之间可以互相发现与互传开源可审计协议核心用 Rust 实现packages/core/src应用层用 Flutter 实现app/lib完整仓库开源可查。下载渠道由于应用没有内置自动更新机制官方建议通过应用商店或包管理器获取版本以便后续更新。各平台的主要分发渠道如下WindowsmacOSLinuxAndroidiOSFire OSMicrosoft StoreMac App StoreFlathubGoogle Play StoreApp StoreAmazon AppstoreWingetHomebrew CaskNixpkgsF-DroidChocolateyDMG 安装器GitHub ReleasesSnapAPKGitHub ReleasesEXE 安装器GitHub ReleasesAURPortable ZIPGitHub ReleasesDEBGitHub ReleasesAppImageGitHub Releases更完整的分发渠道说明见 CONTRIBUTING.md。兼容性平台最低版本备注Android5.0—iOS12.0—macOS11 Big Sur更低版本可用 OpenCore Legacy Patcher 2.0.2 安装Windows10最后支持 Windows 7 的版本为 v1.15.4未来可能对 Win7 做版本回移Linux无强制要求—网络配置防火墙与路由器的两个关键点绝大多数情况下 LocalSend 安装后即可直接使用。如果收发消息或文件出现问题通常需要检查两处网络设置。1. 防火墙放行 53317 端口流量方向协议端口操作入站TCP、UDP53317允许出站TCP、UDP任意允许这个端口不是文档拍脑袋给的数字——它就是协议默认端口。在 Rust 核心库中UDP 组播发现使用的默认端口与 HTTP 服务器默认端口是同一个常量// packages/core/src/multicast/mod.rs第 38-39 行 /// The default multicast port, identical to the default HTTP server port. pub const DEFAULT_PORT: u16 53317;也就是说53317 上同时承载两类流量TCP 的 REST/HTTPS 数据传输以及 UDP 的设备广播发现。CLI 端的配置文件默认注释也印证了这一点cli/src/storage/config.rs 中#port 53317与const DEFAULT_PORT: u16 53317。2. 路由器禁用 AP 隔离客户端隔离请确认路由器上已关闭访问点隔离AP isolation / client isolation。该功能默认通常是关闭的但部分路由器——尤其是访客网络Guest Network——会将其开启一旦开启设备之间的通信会被直接阻断LocalSend 便无法互相发现。高级用法可移植模式与托盘隐藏启动可移植模式Portable Mode自 v1.13.0 起桌面版支持可移植模式在与可执行文件同一目录下放一个名为settings.json的文件内容可以为空应用就会把配置存储到这个文件里而不是默认的操作系统级配置目录。这一行为在应用层有明确的实现app/lib/util/shared_preferences/shared_preferences_portable.dart 中的SharedPreferencesPortable是一个自定义的 SharedPreferences 存储实现它通过buildSettingsPath计算可执行文件所在目录下的settings.json路径当Platform.resolvedExecutable无法解析时例如某些 RAM 虚拟磁盘场景会回退到当前工作目录// app/lib/util/shared_preferences/shared_preferences_portable.dart String buildSettingsPath({ required String? executablePath, required String Function() fallbackDirectory, }) { final directory executablePath null ? fallbackDirectory() : File(executablePath).parent.path; return path.join(directory, settings.json); }该逻辑有单元测试覆盖app/test/unit/util/shared_preferences/shared_preferences_portable_test.dart断言便携模式会把settings.json放在可执行文件旁。相比之下非便携模式下配置位于系统数据目录如 app/lib/provider/persistence_provider.dart 中 Windows 路径%APPDATA%\LocalSend\settings.json。可移植模式的意义在于整个应用目录拷走即带走全部配置非常适合 U 盘便携使用或容器化部署。托盘隐藏启动--hidden自 v1.15.0 起想让应用启动时最小化到托盘/菜单栏不显示主窗口请使用--hidden启动参数例如localsend_app.exe --hidden在 v1.14.0 及更早版本中只有当系统设置了autostart启动项且启动时隐藏开关打开时应用才会隐藏启动新版本统一改为直接监听--hidden参数行为更稳定、更可预期。源码中这个参数以常量startHiddenFlag --hidden定义在 app/lib/util/native/autostart_helper.dart并贯穿三个平台的自启动注册逻辑平台自启动实现--hidden的落点Linux写入~/.config/autostart/app.desktop桌面项追加到Exec行macOS通过 Launch at Login APIsetLaunchAtLoginMinimized(startHidden)Windows写入注册表HKCU\Software\Microsoft\Windows\CurrentVersion\Run的LocalSend值追加到注册表启动命令行因此开机自启 隐藏启动的组合本质就是自启动项的命令行里带上--hidden。工作原理REST API 运行期自签名 TLS 设备指纹LocalSend 使用一套安全的通信协议让设备之间通过 REST API 直接对话。所有数据都通过 HTTPS 传输TLS/SSL 证书在每台设备运行期就地生成——没有 CA、没有证书分发、没有服务器参与。自签名证书与设备身份协议核心库 packages/core/src/crypto/cert.rs 中的generate_self_signed()揭示了完整的身份模型生成RSA-2048密钥对与早期 Flutter 应用用 Dart 生成的证书保持兼容自签名证书的 CommonName 为LocalSend User不带 SAN——因为对等设备完全靠证书指纹相互识别名字不承载任何信息有效期取 rcgen 默认值约 1975 年至 4096 年证书实际上永远不会过期因此无需因时间原因轮换序列号由公钥哈希派生rcgen 默认行为。返回结构SelfSignedCert同时保存 PEM 编码的私钥PKCS#8、公钥SPKI、证书以及证书的SHA-256 指纹DER 字节序列的大写十六进制// packages/core/src/crypto/cert.rs pub fn fingerprint_from_cert_der(cert: [u8]) - String { crate::crypto::hash::sha256(cert) .iter() .map(|byte| format!({byte:02X})) .collect() }设备指纹Fingerprint是 LocalSend 的安全锚点接收方看到发件设备后可以核对并记住其指纹在 UI 中还会把指纹哈希后渲染成 16 个图标便于肉眼比读见 app/lib/util/fingerprint_alphabet.dart。收藏设备Favorites时同样是按指纹精确匹配app/lib/util/favorites.dart。验证侧同样严格verify_cert_from_cert会依次检查时间有效期、公钥是否匹配若提供、以及签名本身任一失败都会抛出可区分的错误。测试用例 packages/core/src/crypto/cert.rs 明确覆盖了签名被篡改公钥不匹配证书过期三类恶意/失效场景确保防御逻辑真实生效。UDP 组播发现如何看到附近设备发现阶段走 UDP 组播同样由 packages/core/src/multicast/mod.rs 实现IPv4 组播组224.0.0.167——特意选在224.0.0.0/24范围内因为部分 Android 设备只能收到该网段的 UDP 组播IPv6 组播组ff12::fd3a:e420link-local 作用域的临时组作为协议 v2.2 之上的 LocalSend 扩展与 IPv4 并行广播发现不是一问一答设备只发送广播announce广播本身不等待 UDP 回应收到广播的一方会向广播方发起 HTTP 注册请求register来完成握手每次广播是一个爆发burst分别在 100ms / 500ms / 2000ms 重复发送以应对单个数据报丢失、以及刚接入网络的设备尚未就绪的情况。这也解释了为什么防火墙规则里UDP 53317 必须放行组播发现与 HTTP 服务器复用同一端口缺了 UDP设备列表就是空的。从源码编译运行想从源码编译 LocalSend步骤如下安装 Flutter——直接安装或使用 [fvm] 管理版本项目要求的版本见 .fvmrc当前为Flutter 3.41.9安装 Rust 工具链仓库根目录的 rust-toolchain.toml 会约束具体版本克隆本仓库进入应用目录cd appflutter pub get拉取 Dart 依赖flutter run启动应用。注意LocalSend 目前要求特定较旧版本的 Flutter即 .fvmrc 中列出的版本。如果你在全系统安装了别的 Flutter 版本版本不一致就是最常见的构建失败原因。为了让开发体验一致LocalSend 使用fvm管理项目级 Flutter 版本安装 fvm 后用fvm flutter代替flutter执行后续命令。仓库为 Rust 侧提供了独立工作区根目录 Cargo.toml 聚合了packages/core协议核心、cli命令行客户端、server独立服务器组件等 crateFlutter 与 Rust 之间通过packages/localsend_isolates中的 flutter_rust_bridge 代码绑定通信。协议文档细节可在官方协议仓库中查阅协议实现以本仓库 packages/core 为准。参与贡献翻译LocalSend 使用 Weblate 平台管理翻译你也可以克隆仓库手工提交翻译。翻译资源位于 app/assets/i18n 目录包含各语种的*.json词条文件与缺失翻译清单_missing_translations_locale.jsonDart 侧对应的生成代码在 app/lib/gen。注意以开头的字段不是待翻译内容——它们不会被应用使用只是给翻译者提供的文件说明性文字或上下文提示。Bug 修复与功能改进Bug 修复发现问题后请提交带有清晰问题描述与修复方式的 PR功能改进有改进想法时请先提交一个 issue 讨论其必要性再动手实现。完整的贡献规范含分发渠道维护说明见 CONTRIBUTING.md。故障排除问题平台发送方平台接收方解决方案设备不可见任意任意确认路由器已禁用 AP 隔离开启时设备间通信会被阻断设备不可见任意Windows把网络配置为专用网络PrivateWindows 对公用网络限制更严格设备不可见macOS / iOS任意尝试在系统隐私设置中切换本地网络权限开关速度太慢任意任意使用 5 GHz Wi-Fi在两台设备上关闭加密速度太慢任意Android已知问题与 SAF 流实现有关见 Flutter saf_stream 上游 issue结合前文的协议分析排查设备不可见时可以按这条链路逐段检查AP 隔离是否关闭 → 防火墙是否放行 TCPUDP 53317 入站 → macOS/iOS 本地网络权限是否授予 → Windows 网络配置文件是否为 Private。速度慢则优先怀疑 2.4 GHz 频段拥塞或加密带来的 CPU 开销两端同时关闭加密可显著提速代价是失去传输加密。小结LocalSend 用一套极简但严谨的架构实现了AirDrop 式体验53317 端口上 UDP 组播负责设备发现TCP/HTTPS 负责数据传输RSA-2048 自签名证书加 SHA-256 指纹负责设备身份与信任锚定全程零服务器、零互联网依赖。对使用者而言只需记住三件事——放行 53317TCPUDP、关闭 AP 隔离、必要时用settings.json便携模式和--hidden参数对开发者而言从 .fvmrc 锁定 Flutter 版本、cd app flutter pub get flutter run即可本地跑通协议细节则可直接在 packages/core 的 Rust 源码与测试中逐行验证。【免费下载链接】localsendAn open-source cross-platform alternative to AirDrop项目地址: https://gitcode.com/GitHub_Trending/lo/localsend创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考