Go to file
2026-05-11 16:11:57 +08:00
readme 新增语言 2026-05-11 16:11:57 +08:00
src 新增lang参数 2026-05-11 15:51:41 +08:00
static 新增desktop 新增修复速率 2026-05-07 17:10:16 +08:00
.eslintrc.js init 2025-01-02 11:21:04 +08:00
.gitignore init 2025-01-02 11:21:04 +08:00
index.html init 2025-01-02 11:21:04 +08:00
LICENSE init 2025-01-02 11:21:04 +08:00
package-lock.json 新增turn 2026-05-09 18:21:10 +08:00
package.json 新增turn 2026-05-09 18:21:10 +08:00
README.md 修改样式 2026-05-11 11:16:28 +08:00
shims-uni.d.ts init 2025-01-02 11:21:04 +08:00
tsconfig.json init 2025-01-02 11:21:04 +08:00
vite.config.ts 新增desktop 新增修复速率 2026-05-07 17:10:16 +08:00
yarn.lock 新增turn 2026-05-09 18:21:10 +08:00

p2p-explorer-web - P2P 文件传输工具

p2p-explorer-web 是一个基于 WebRTC 的 P2P 远程文件传输、远程文件浏览与实时通信工具。支持在设备间安全、快速地传输文件,并提供远程桌面预览、语音通话和摄像头画面共享等功能,理想情况下无需通过服务器中转数据。

在线体验:https://explorer.kuraa.cc

功能特性

  • P2P 流式文件传输 - 基于 WebRTC 的点对点传输,支持大文件分片传输,文件数据不经过服务器
  • 文件夹传输 - 支持完整目录结构的浏览与传输
  • 远程文件浏览 - 可作为远程文件 Web 资源管理器,浏览对方设备的文件系统
  • 本地权限管控 - 支持对本地目录设置读取/写入权限,保护隐私
  • 远程桌面预览 - 实时查看对方桌面画面,支持音频传输与全屏模式
  • P2P 语音通话 - 端到端加密的实时语音通话,显示通话延迟
  • 摄像头画面共享 - 实时查看对方摄像头画面
  • 剪贴板共享 - 获取对方设备的剪贴板文本内容
  • ID 连接机制 - 通过简单的 ID 或分享链接即可建立连接
  • PWA 支持 - 支持安装为独立桌面应用Service Worker 离线缓存)
  • 无需安装客户端 - 基于浏览器即可使用

截图

文件同步 桌面预览 语音摄像头

架构说明

数据传输流程

┌──────────┐                              ┌──────────┐
│  设备 A   │ ←── WebRTC P2P 直连 ──────→ │  设备 B   │
└──────────┘                              └──────────┘
      ↑                                          ↑
      │  信令交换ID 连接)                        │
      ↓                                          ↓
┌──────────────────────────────────────────────────┐
│          PeerJS 信令服务器 (wss://0.peerjs.com)       │
│           STUN/TURN 服务器NAT 穿透/中继)             │
└──────────────────────────────────────────────────┘
  • 直连模式:双方通过 UDP 打洞建立直连,数据传输不经过任何服务器,速度快且安全
  • 中继模式:当直连失败(如双方都在对称 NAT 后),通过 TURN 服务器中继数据

需注意的服务

服务 用途 数据安全性
PeerJS 信令 交换 ICE 候选信息 可信,无本地数据上传
PeerJS 打洞 UDP 打洞辅助 可信,无数据上传
STUN 服务器 获取公网 IP 及 NAT 类型 可信,仅交换网络信息
TURN 中转服务器 NAT 穿透失败时的数据中继 不可信,所有数据会经过我的服务器

建议:如需传输敏感文件,建议自行 Docker 化部署 STUN/TURN 服务器,保证全链路数据安全。

快速开始

环境要求

  • Node.js >= 16
  • Yarn 或 npm
  • 支持 WebRTC 的现代浏览器Chrome / Edge / Firefox

安装与运行

# 克隆项目
git clone [项目地址]
cd p2p-explorer-web

# 安装依赖
yarn install

# 启动开发服务器(默认开启 HTTPSWebRTC 需要安全上下文)
yarn dev

启动后访问 https://localhost:5173(注意是 https

构建部署

# 构建生产版本
yarn build

# 将静态资源拷贝到 dist 目录
cp -r static dist/

# 部署 dist 目录到任意静态文件服务器(需要 HTTPS

使用方法

基本使用

  1. 设备 A 打开应用,系统自动生成唯一的 Peer ID
  2. 点击 复制 按钮复制自己的 ID或点击 分享 一键复制分享链接
  3. 设备 B 在同一页面输入设备 A 的 ID点击 连接
  4. 连接建立后,双方即可互相浏览远程文件目录

发送文件

  1. 在左侧 本地文件区域 选择要发送的文件或文件夹(支持 Ctrl/Shift 多选)
  2. 点击中部的 发送 按钮,文件开始传输
  3. 在底部 传输列表 中可查看传输进度、速度和状态

接收文件

  1. 在右侧 远程文件区域 选择要下载的文件
  2. 点击中部的 接收 按钮,选择本地保存位置
  3. 文件自动下载到指定目录

远程桌面

  1. 连接成功后,点击状态栏的 桌面图标 发起远程桌面请求
  2. 对方确认后即可实时预览其桌面画面
  3. 支持全屏模式和音频开关

语音通话

  1. 连接成功后,点击 电话图标 发起语音通话
  2. 通话过程中可随时静音/取消静音
  3. 实时显示通话延迟

摄像头

  1. 点击 摄像头图标 请求查看对方摄像头画面
  2. 再次点击可关闭画面

项目结构

p2p-explorer-web/
├── src/
│   ├── pages/
│   │   ├── file/                    # 文件传输主页面
│   │   │   ├── index.vue            # 主页面入口
│   │   │   ├── item/                # 子组件
│   │   │   │   ├── clipboard.vue    # 剪贴板共享
│   │   │   │   ├── desptopView.vue  # 远程桌面视图
│   │   │   │   ├── fileIcon.vue     # 文件图标
│   │   │   │   ├── fileItem.vue     # 文件列表项
│   │   │   │   ├── filePermissionSetDialog.vue # 权限设置弹窗
│   │   │   │   ├── fileReader.vue   # 文件阅读器
│   │   │   │   ├── fileTranserView.vue # 传输列表视图
│   │   │   │   └── fileView.vue     # 文件浏览器视图
│   │   │   └── utils/               # 工具类
│   │   │       ├── common.ts        # 通用工具函数
│   │   │       ├── emitter.ts       # 事件总线
│   │   │       ├── fileMgr.ts       # 文件管理器
│   │   │       ├── fileTransfer.ts  # 文件传输核心
│   │   │       ├── peer.ts          # P2P 连接管理器
│   │   │       └── turn.ts          # TURN 服务器配置
│   │   ├── voice/
│   │   │   └── webrtcVoice.vue      # P2P 语音通话
│   ├── router/
│   │   └── router.ts                # 路由配置
│   ├── types/                       # TypeScript 类型定义
│   ├── utils/
│   │   └── pwa.ts                   # PWA 提示控制
│   ├── App.vue
│   └── main.ts
├── static/                          # 静态资源(图标、图片等)
├── readme/                          # README 相关图片
├── vite.config.ts
├── tsconfig.json
└── package.json

待完成

  • Docker 化部署,支持自定义 STUN/TURN 服务器一键部署

感谢

  • PeerJS 提供的 WebRTC 简化封装