Peer-to-Peer · LAN Only

局域网里,文件直接过去
不绕公网,不进网盘。

LanShare 是一套纯局域网的点对点文件互传与即时通信工具。两台设备互为服务端与客户端, 分片直接推到对方磁盘上 —— 没有中转服务器,没有外网依赖,不用注册账号。 传输速度的上限,就是你路由器和网线的物理带宽。

0 中心服务器 0 外网流量 0 账号注册 Ed25519 双向配对 断点续传 + SHA-256 校验
下载 v0.1.0 看看它怎么工作 Windows 安装包 / 免安装版 · Android APK

Why

为什么不是又一个网盘

把一个 8 GB 的文件从电脑传到手机,走网盘要先上行到机房再下行回来, 两次跨越公网、两次受制于宽带上行。而它们本来就在同一个交换机下面。

跑满物理带宽

数据只在局域网内走一跳。千兆有线就是千兆的速度,不被宽带上行掐脖子,也不排队等云端配额。

文件不离开你的网段

没有中转服务器意味着没有第三方副本、没有服务端日志、没有账号体系。私钥留在设备本地,不出机器。

开着就互相看见

UDP 广播自动发现,两端启动一两秒就出现在彼此的雷达页。路由器开了 AP 隔离,还能手动填 IP 单播直连。

How it works

每台设备同时是服务端和客户端

发送方把分片直接 PUT 到对端设备上跑着的 HTTP 服务, 接收方负责落盘、校验与归档。两端之间没有任何第三方。

设备 A · 桌面端 Tauri 2 + Rust UDP 53317 监听/广播 HTTP Server :53317 HTTP Client WS /chat 设备 B · Android Kotlin + Ktor UDP 53317 监听/广播 HTTP Client HTTP Server :53317 WS Client 发现广播 文件分片 聊天消息 无中心服务器 · 无外网依赖

发现

每 5 秒向 255.255.255.255 与组播 224.0.0.167 广播身份,30 秒无心跳判离线。遇到 AP 隔离,可手动输入 IP:Port 走单播探针直连。

配对

Ed25519 公钥指纹 + 6 位一次性动态码。两端屏幕上的码一致、且双方都点了确认,才会写入信任列表。

握手

发送端提交文件名、大小与 SHA-256;接收端回一个已落盘的 offset —— 这就是断点续传的起点。缺哈希直接拒绝握手,没有「没校验和就当过了」的降级路径。

分片传输

1 / 2 / 4 MB 分片按偏移随机写入。全程流式读写,内存占用恒定 —— 传 50 GB 和传 50 MB 一样不吃内存。

校验归档

全量 SHA-256 比对通过后,文件才从 .tmp 发布到目标目录。文件名强制净化,../、绝对路径与非法字符一律拦掉。

用途协议端口
设备发现UDP53317(固定)
文件传输 + 聊天TCP · HTTP/1.1 + WebSocket53317,被占用时依次尝试 53318…53327

实际监听端口通过 UDP 发现报文的 port 字段告知对端,所以 TCP 端口漂移不影响互通。

Features

功能一览

两端各自原生实现,共用同一份线上协议契约;任何一端单方面偏离,双向契约测试就会有一侧变红。

F1 · 发现

找得到彼此

UDP 广播与组播、主动探针、手动 IP 直连、隐身开关。

F2 · 安全

配对才可信

Ed25519 身份、指纹比对、6 位动态码双向确认、信任白名单。未配对设备的请求挂起等人工确认,不自动接收。

F3 · 传输

大文件不吃内存

1/2/4 MB 分片、流式读写、实时速率与 ETA。

F4 · 容灾

断了能接着传

按偏移断点续传、流式 SHA-256 校验、断连重试上限。

F5 · 平台

后台也在传

Android 前台服务保活,通知栏显示进度并支持暂停/取消;桌面端托盘常驻、可自定义落盘目录。

F7 · 通信

顺手聊两句

WebSocket 全双工聊天,文件卡片与消息混编,心跳 + 指数退避重连。

F8 · 观测

出了问题看得见

协议报文日志、丢包率/限速/时延故障注入、链路测速。

Stack

技术栈

桌面端 Tauri 2 + React 19 + Rust 协议栈;Android 端 Kotlin + Jetpack Compose + Ktor。

Download

下载 v0.1.0

构建于 2026-09-10。所有安装包直接由本站分发,下方附 SHA-256 校验值,装之前建议核一下。

桌面端 · Windows x64

协议栈测试通过

Tauri 2 + Rust · 单元测试与端到端真实互传测试全部通过

macOS / Linux:代码支持,但本次没有出对应平台的安装包。需要的话从源码 npm run tauri build 自行构建。

移动端 · Android 8.0+

实验性

Kotlin + Compose · 已 v2/v3 签名,可直接侧载

请先读这段再装。Android 端从未在任何真机或模拟器上运行过。 仓库里只有 21 项 JVM 单元测试(含跨端协议契约测试),没有仪器化测试、没有设备 CI。 也就是说 UDP 广播能否穿透你的路由器、实际 Wi-Fi 吞吐、灭屏长传的保活效果、 MediaStore 落盘、各家 ROM 的后台策略差异 —— 这些全部未经验证。 当它是个等你反馈的实验品,别用它传唯一一份重要文件。
SHA-256 校验值
LanShare_0.1.0_x64-setup.exe
5ccce1f6ebd5db8bee4668be46a269dc5f427c406279d4fae7b0ed9dc49c5ab6

LanShare_0.1.0_x64_en-US.msi
6f6a5311549dd9d19966e59b04c98311492d84a4c8776de4d2b7de5e2973e695

lanshare-desktop.exe
eb5e1610ca603878a80f5f1940d95d5555704867d44e23231134731da448a925

lanshare-android-1.0.0-release.apk
8b7f4cf1cbb4f9931c45d672fcd71945da19d50479636e2225a997cc2f3dec0f

装完之后

连同一个局域网

电脑和手机接同一个 Wi-Fi 或网段。别用访客网络 —— 那上面通常开了 AP 隔离,两台设备互相看不见。

互相发现

两端都启动,雷达页 1~2 秒内应该出现对方的卡片。

配对

点击配对,核对两端弹出的 6 位动态码一致,然后双方都确认。

传一个试试

任选一端发文件,看进度和速率,完成后在接收端确认落盘路径和哈希校验结果。

看不见对方时

依次检查:是否同网段 → 防火墙是否放行 UDP/TCP 53317 → 仍不行就用「手动 IP 直连」填对端 IP:53317

Security & Limits

安全模型与已知边界

这一节不是免责声明,是使用说明。知道它在哪儿结实、哪儿薄,你才用得对。

私钥不出设备

Ed25519 身份文件存放在应用私有目录,不上传、不同步、不进版本库。

双向确认才建立信任

6 位一次性动态码需要两端各自点确认。未配对设备发来的传输请求会挂起等人工处理,不会自动接收。

路径穿越已拦截

接收端强制净化文件名,阻断 ../、绝对路径与非法字符;同名冲突按策略重命名而非覆盖。

哈希缺失即拒绝

握手阶段没有 SHA-256 就直接拒绝,不存在「校验不了就放行」的降级分支。

v1 是明文 HTTP,不要暴露到公网

局域网内不做 TLS。Android 侧只对 10/8172.16/12192.168/16169.254/16 与回环放行明文,其余仍强制 HTTPS —— 不是把全局明文开关打开。但这套东西的设计前提就是可信局域网,别做端口映射。

Android 端未经真机验证

APK 能构建、JVM 单元测试全绿,但从未在真实设备上跑过。见上方下载区的完整说明。

「提取 APK」功能有上架风险

该功能依赖 QUERY_ALL_PACKAGES,属于 Google Play 敏感权限,需单独申报且很可能被拒。若计划上架,建议移除该权限并砍掉这个功能;侧载不受影响。

桌面端只出了 Windows 包

macOS 与 Linux 需自行从源码构建。