基于 WebRTC 的极简点对点文件传输工具
无需服务器中转 · 无需注册登录 · 部署完成,打开即用
默认端口为 3001。您可以通过以下两种方式修改:
-
环境变量(推荐)
在启动时设置
PORT环境变量:# Linux/macOS PORT=8080 bun run start # Windows (PowerShell) $env:PORT=8080; bun run start
-
修改配置文件
直接编辑
src/server/config.ts文件:export const SERVER_CONFIG = { PORT: 3001, // 修改此处 // ... }
- 纯 P2P 传输 — 文件数据直接在浏览器之间传输,服务器仅负责信令协商,不经手任何文件内容
- 零配置 — 一方创建房间获得 6 位数字房间码,另一方输入即可连接
- 断点续传 — 传输中断后自动恢复,基于 IndexedDB 持久化进度,支持跨会话续传
- 完整性校验 — 块级与文件级双重校验,缺块自动补传,确保传输零损坏
- 背压控制 — 事件驱动 + 轮询自动回退的双模式背压机制,64KB 分块流式传输,避免内存溢出
- 分级重连 — ICE 重启 → 连接重建 → 指数退避,最大程度保障传输连续性
- 多文件队列 — 支持批量选择文件,串行有序传输
- 隐私安全 — 数据不经过任何第三方服务器,传输链路由 WebRTC 加密保护
| 层级 | 技术 |
|---|---|
| 前端 | React 18 + TypeScript |
| 通信 | 原生 WebRTC DataChannel |
| 信令 | Bun WebSocket |
| 运行时 | Bun |
| 构建 | Bun Bundler |
# 克隆仓库
git clone https://github.com/Ronifue/peershare.git
cd peershare
# 安装依赖
bun install
# 开发模式(热重载)
bun run dev
# 生产构建
bun run build
# 启动生产服务
bun run start开发服务器默认监听 http://localhost:3001。
- 打开 PeerShare 页面
- 发送方:点击「创建房间」,获得 6 位房间码
- 接收方:输入房间码,点击「加入房间」
- 连接建立后,发送方选择文件即可开始传输
peershare/
├── src/
│ ├── client/ # React 前端
│ │ ├── App.tsx # 应用入口与状态管理
│ │ ├── components/ # UI 组件
│ │ ├── webrtc*.ts # WebRTC 连接与信令
│ │ ├── transfer-*.ts # 传输协议(发送/接收/续传/校验)
│ │ └── send-queue.ts # 多文件发送队列
│ ├── common/ # 前后端共享模块
│ │ ├── config.ts # 统一配置(STUN/ICE/传输参数)
│ │ ├── types.ts # 类型定义
│ │ └── structured-event.ts # 结构化事件协议
│ └── server/ # Bun 信令服务器
│ └── index.ts # WebSocket 信令处理
├── public/ # 静态资源与构建输出
├── e2e/ # Playwright 端到端测试
├── tests/ # 单元测试
└── scripts/ # 构建脚本
bun run dev # 开发模式,监听文件变化自动重启
bun run build # 生产构建
bun run start # 启动生产服务
bun run test # 运行单元测试
bun run test:e2e # 运行端到端测试
bun run typecheck # TypeScript 类型检查- 信令阶段:双方通过 WebSocket 交换 SDP Offer/Answer 和 ICE Candidate,完成 NAT 穿透协商
- 传输阶段:建立 WebRTC DataChannel 后,文件以 64KB 分块流式传输,全程 P2P 直连
- 可靠性保障:背压控制防止缓冲区溢出,断线后自动分级重连,支持断点续传和完整性校验
支持所有现代浏览器:
- Chrome / Edge 80+
- Firefox 80+
- Safari 15+
注意:WebRTC P2P 连接依赖 NAT 类型。对称型 NAT 环境下可能无法直连(本项目仅使用 STUN,并未配置 TURN 中继)。
- 感谢 小鹿快传 为本项目提供的灵感来源。

