一个零依赖、纯 Node.js 的局域网文件与消息传输工具。在一台设备上启动后,同一局域网(同一 WiFi)内的电脑和手机都可以通过浏览器访问,互传文件、图片、视频和文字消息。无需安装任何 App,也无需外网。
支持 Windows / macOS / Linux / 安卓(浏览器或 WebView App),单文件绿色版可直接运行。
- 📝 发送文字消息,实时同步到所有已连接设备(SSE 推送)
- 📁 上传 / 下载任意文件(图片、视频、音频、文档、压缩包、APK 等)
- 🖼 图片在线预览(点击可放大),视频 / 音频在线播放
- 📋 直接粘贴截图即可发送(Ctrl+V / 长按粘贴)
- 🖱 拖拽文件到窗口即可发送
- 📱 手机扫码即可打开(二维码)
- ✏️ 自定义昵称,区分消息来源
- 📶 断线自动重连,实时状态指示
- 🛑 打包版可从网页优雅退出服务
在 Releases 页面下载对应平台的可执行文件,无需安装 Node.js,双击即可运行:
| 文件 | 适用系统 |
|---|---|
lan-share-win-x64.exe |
Windows(64 位) |
lan-share-macos-arm64 |
macOS(Apple Silicon,M 系列) |
lan-share-macos-x64 |
macOS(Intel 芯片) |
lan-share-linux-x64 |
Linux(64 位) |
运行后自动打开浏览器进入 http://localhost:8000;手机在同一 WiFi 下打开页面显示的局域网地址(或点右上角「设备连接」扫码)即可互传。
退出程序:点网页右上角「设备连接」→「停止服务并退出」。数据保存在用户主目录
~/.lan-share/。
Windows:首次双击会被 SmartScreen 拦截,点「更多信息」→「仍要运行」。若弹出防火墙提示,选「允许访问」(局域网功能必需)。
macOS:二进制已做 ad-hoc 签名。若被 Gatekeeper 拦截,任选其一:
- 右键 →「打开」→ 再点「打开」;或
- 终端解除隔离后运行:
# Apple Silicon (M 系列)
xattr -d com.apple.quarantine lan-share-macos-arm64
# Intel
xattr -d com.apple.quarantine lan-share-macos-x64Linux:
chmod +x lan-share-linux-x64
./lan-share-linux-x64node server.js
# 或
npm start
# 指定端口
node server.js 9000
# 或 PORT=9000 node server.js启动后浏览器打开 http://localhost:8000,手机连接同一 WiFi 后访问打印的局域网地址。
仓库内 android/ 目录是安卓 WebView 壳工程(Java,无 Gradle 依赖),将 MainActivity.java 中的 URL 常量改为你电脑的局域网地址,用 android/build.sh 本地构建 APK(需 Android SDK + Java 17,纯本地工具链,无需联网):
cd android
./build.sh # 产物: android/out/lan-share-v1.0.apk
adb install -r out/lan-share-v1.0.apkAPK 特性:文件选择器(上传可用)、JS 弹窗转 Toast、返回键回退、屏幕常亮。注意 APK 内 IP 是编译期写死的,换网络后需重新打包。
lan-share-start.sh 启动器:检测服务未运行则拉起,然后打开浏览器。GNOME 桌面直接双击 lan-share.desktop(图标已内联绝对路径)。
| 操作 | 方式 |
|---|---|
| 发送文字 | 底部输入框输入,回车(或点发送按钮) |
| 发送文件 / 图片 | 点底部 + 选择文件,或直接把文件拖进窗口 |
| 发送截图 | 截图后回到页面直接 Ctrl+V(电脑)/ 长按粘贴(手机) |
| 下载文件 | 点文件卡片上的「下载」 |
| 删除文件 | 点文件卡片上的「删除」 |
| 放大图片 | 点击图片 |
| 清空记录 | 点右上角垃圾桶图标 |
| 修改昵称 / 停止服务 | 点右上角「设备连接」图标 |
| 配置 | 说明 | 默认值 |
|---|---|---|
| 端口 | 命令行第一个参数或环境变量 PORT |
8000(被占用时自动 +1 递增,最多试 20 次) |
| 单文件大小上限 | 环境变量 MAX_UPLOAD_MB(单位 MB,0 不限制) |
不限制 |
| 数据目录 | 环境变量 LAN_SHARE_HOME |
~/.lan-share |
| 监听地址 | 环境变量 HOST |
0.0.0.0 |
| 自动打开浏览器 | 源码运行时加 --open 参数(打包版默认自动打开) |
关 |
所有接口返回 JSON。CORS 全开,任何同网段设备可直连。
GET /api/info
{ "name": "局域网传文件", "port": 8000, "ips": ["192.168.1.100"] }GET /api/messages— 全部消息(最多 500 条)POST /api/messages— 发送消息,body:{ "text": "...", "from": "昵称" },返回{ ok, message }。type: "image"也可发送图片类消息DELETE /api/messages— 清空全部消息
GET /api/files— 文件列表,每项含id/name/size/time/mime/kind/from/urlPOST /api/upload— 上传,?name=文件名&from=昵称,body 为文件二进制(流式写入,支持大文件)DELETE /api/files— 清空全部文件GET /files/<文件名>— 下载 / 预览(图片视频音频内联,其余附件下载)DELETE /files/<文件名>— 删除单个文件
GET /api/events — Server-Sent Events 长连接,事件负载为 { event, data }:
| event | data | 说明 |
|---|---|---|
message |
消息对象 | 新消息 |
file |
文件对象 | 新文件 |
file-removed |
{ name } |
文件被删除 |
clear-messages |
{} |
消息已清空 |
clear-files |
{} |
文件已清空 |
hello |
{ time } |
连接建立 |
每 25s 发送心跳 : ping 防中间设备断连。
POST /api/shutdown — 优雅退出(打包版双击运行无终端时用)。返回 { ok: true } 后 300ms 退出。
浏览器 (电脑/手机) ──HTTP──▶ Node.js server.js ◀── 上传流式写入 ──▶ ~/.lan-share/uploads/
│ │ 零依赖 http 模块 messages.json
└──────SSE 长连接────────┘
- 服务端:原生
http模块,零第三方依赖。上传流式写入 + 背压处理(pause/drain),大文件不占内存 - 实时通信:SSE 广播,断线自动重连,25s 心跳
- 安全:文件名 sanitize 防路径穿越(
resolveInUploads校验)、uniqueName防重名、文件大小上限可控 - 数据:
~/.lan-share/(打包版__dirname是只读虚拟目录,故数据统一放用户主目录) - 前端:原生 JS,零依赖。手写 DOM 渲染、粘贴截图、拖拽上传、二维码(外链 qrserver.com,离线时降级显示文本地址)
lan-share/
├── server.js # 服务端(纯 Node.js,零依赖,~500 行)
├── package.json # 含 pkg 打包脚本 (npm run build)
├── lan-share-start.sh # Linux 桌面启动器
├── lan-share.desktop # GNOME 桌面快捷方式
├── android/ # 安卓 WebView 壳工程(Java + build.sh)
├── public/ # 前端页面
│ ├── index.html
│ ├── style.css
│ ├── app.js
│ └── favicon.svg
└── dist/ # pkg 打包产物(绿色版,不入库,见 Releases)
交叉编译全部平台(Linux 上需 ldid 给 macOS 产物做 ad-hoc 签名):
npm install
npm run build # 产物输出到 dist/Q: 手机打不开地址?
- 确认手机和电脑连的是同一个 WiFi
- 确认电脑防火墙放行了该端口(Windows 首次启动时选「允许访问」)
- 部分路由器开了「AP 隔离」,需在路由器后台关闭
Q: 二维码加载不出来? 二维码由第三方在线服务生成,需要联网;离线时手动在手机浏览器输入页面显示的网址即可。
Q: 手机和电脑如何双向互传? 手机浏览器打开页面后同样可发文字和文件,双向互通。
Q: 换了端口后手机还连得上吗? 需要重新打开新端口对应的网址。
Q: 升级后旧数据还在吗?
数据统一在 ~/.lan-share/。若此前用过旧版(数据在项目目录 uploads/、messages.json),需手动移到 ~/.lan-share/ 下。