# qdlocalshare **Repository Path**: DragonCodingPlus/qdlocalshare ## Basic Information - **Project Name**: qdlocalshare - **Description**: windows 和 mac版本的DLocalShare,支持局域网多线程传文件。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2026-06-13 - **Last Updated**: 2026-06-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # DLocalShare - 局域网点对点文件传输工具
![App Icon](ic_app_icon.png) **快速、安全、无需服务器的本地文件传输解决方案** [功能特性](#features) • [快速开始](#quick-start) • [技术架构](#architecture) • [构建指南](#building) • [协议说明](#protocol)
--- ## 📖 简介 DLocalShare 是一款基于 Qt6/QML 开发的跨平台局域网文件传输应用,支持在 Wi-Fi 网络中的设备之间直接进行高速文件传输,无需任何中间服务器或互联网连接。 ### 核心优势 - **零配置**: 自动发现局域网内的其他设备,无需手动输入 IP 地址 - **高速传输**: 采用多线程并行传输技术,充分利用 Wi-Fi 带宽 - **断点续传**: 支持传输中断后从断点继续,避免重复传输 - **隐私安全**: 纯本地运行,所有数据仅在局域网内传输 - **跨平台**: 支持 macOS、Windows 桌面平台 --- ## ✨ 功能特性 ### 设备发现 - 基于 UDP 多播协议的自动设备发现 - 实时显示在线设备列表 - 支持设备名称自定义和编辑 - 自动处理网络接口选择(Wi-Fi) ### 文件传输 - **并行传输**: 将文件分割为多个块,通过 3 个并行 TCP 连接同时传输 - **断点续传**: 传输中断后可从已完成的块继续,无需重新开始 - **进度可视化**: 实时显示整体进度和每个块的传输状态 - **速度监控**: 实时计算并显示传输速度 - **批量发送**: 支持一次选择多个文件发送给同一设备 - **取消与重试**: 可随时取消传输或重试失败的传输 ### 用户体验 - **现代化界面**: 基于系统默认主题的简洁美观界面 - **国际化**: 支持中文和英文界面 - **保存位置自定义**: 可自定义文件保存目录 --- ## 🚀 快速开始 ### 系统要求 - **操作系统**: macOS 14.0+ / Windows 10 - **内存**: 最低 2GB RAM - **网络**: Wi-Fi 网络连接(所有设备需在同一局域网内) - **磁盘空间**: 至少 50MB 可用空间用于应用程序 ### 安装 #### macOS 1. 下载 `DLocalShare_x.x.x.dmg` 文件 2. 双击 DMG 文件打开 3. 将 `DLocalShare.app` 拖拽到 `Applications` 文件夹 4. 首次运行时,在"系统偏好设置 > 安全性与隐私"中允许运行 #### Windows 1. 下载 `DLocalShare_x.x.x.zip` 安装包 2. 解压安装包,双击运行 `DLocalShare.exe` 3. 启动应用程序 ### 使用方法 #### 接收文件 1. 确保您的设备已连接到 Wi-Fi 网络 2. 启动 DLocalShare 应用 3. 应用会自动进入等待接收状态 4. 当其他设备向您发送文件时,传输会自动开始 5. 文件默认保存到 `Downloads/LocalShare/` 目录 #### 发送文件 **方式一:从应用内发送** 1. 点击主界面右上角的设备列表图标 2. 选择要发送的文件 3. 从设备列表中选择目标设备 4. 点击"发送到 N 台设备"按钮 **方式二:系统分享菜单** 1. 在文件管理器中右键点击文件 2. 选择"分享"或"发送到" 3. 选择"DLocalShare"作为分享目标 4. 在弹出的设备列表中选择目标设备 5. 点击"发送"按钮 #### 管理传输 - **查看传输列表**: 点击主界面的"查看接收中 (N)"按钮 - **取消传输**: 在传输列表中点击删除图标,确认后即可取消 - **重试失败传输**: 对于失败的传输,点击重试图标即可重新发送 --- ## 🏗️ 技术架构 ### 概述 DLocalShare 采用双层架构设计,包含设备发现和文件传输两个独立子系统: | 子系统 | 用途 | 传输协议 | |--------|------|----------| | **设备发现** | 在局域网中发现和通告设备 | UDP 多播 (IPv4) | | **文件传输** | 在已发现设备间传输文件 | TCP (每文件多并发连接) | ### 设备发现协议 (LocalGroup) 基于自定义 UDP 多播协议实现: - **多播地址**: `239.255.88.88` - **端口**: `41575` - **TTL**: `1` (仅限链路本地,不会被路由器转发) - **最大数据包**: `4096` 字节 **帧格式** (UTF-8 JSON): ```json { "type": "REGISTER", "deviceId": "uuid-string", "deviceName": "My Computer", "ipv4": "192.168.1.100", "port": 41576 } ``` **工作流程**: 1. 设备启动时广播 `REGISTER` 消息 2. 收到其他设备的 `REGISTER` 后回复 `ACK` 3. 设备离线时广播 `EXIT` 消息 4. 维护实时更新的在线设备列表 ### 文件传输协议 采用基于块的并行传输机制: **传输参数**: - **线程数**: 3 (可配置) - **连接超时**: 10 秒 - **读取超时**: 10 秒 **消息帧格式**: ``` [1 字节类型][4 字节大端序长度][N 字节载荷] ``` **消息类型**: - `0x08` (`MSG_RESUME_INFO`): 断点续传信息 - `0x09` (`MSG_BLOCK_HEADER`): 块元数据头 **块分割算法**: ``` numThreads = 3 baseSize = fileSize / numThreads remainder = fileSize % numThreads 对于每个块 i (0 到 numThreads-1): offset = i * baseSize + min(i, remainder) size = baseSize + (1 if i < remainder else 0) ``` 这种分割方式确保文件大小均匀分布,各块大小差异不超过 1 字节。 **传输流程**: ``` 发送方 接收方 │ │ │──── TCP 连接 ───────────────────►│ │ │ │──── MSG_BLOCK_HEADER ──────────►│ │ {块信息 JSON} │ │ │ │◄─── MSG_RESUME_INFO ───────────│ │ {transferId, blockIndex, │ │ receivedBytes} │ │ │ │──── 原始块数据 ─────────────────►│ │ (根据续传信息调整偏移量) │ │ │ │──── TCP FIN ───────────────────►│ │ │ ``` ### 断点续传机制 **预分配文件**: - 接收方在传输开始前创建 `.temp` 临时文件,预分配完整文件大小 - 使用 `QFile::resize(fileSize)` 确保磁盘空间充足 - 允许多个并发连接随机写入不同位置 **元数据文件 (.meta)**: ```json { "transferId": "uuid", "blockBytes": [1024000, 1024000, 512000] } ``` - 记录每个块已接收的字节数 - 每秒最多写入一次,减少 I/O 开销 - 传输完成后自动删除 **崩溃恢复**: - 接收方启动时检查 `.meta` 文件 - 恢复每个块的进度,只请求未完成的块 - 所有块完成后重命名 `.temp` 为最终文件名 ### 数据模型 **TransferItem** (传输项): ```cpp struct TransferItem { QString id; // UUID QString fileName; // 文件名 qint64 fileSize; // 文件大小(字节) QString mimeType; // MIME 类型 TransferDirection direction; // SEND / RECEIVE TransferStatus status; // PENDING / TRANSFERRING / COMPLETED / ERROR float progress; // 进度 0.0 - 1.0 qint64 transferredBytes; // 已传输字节数 int totalChunks; // 总块数 QSet completedChunks; // 已完成块索引 QString targetDeviceName; // 目标设备名称 QString localFilePath; // 本地文件路径 QString errorMessage; // 错误信息 qint64 speedBytesPerSec; // 传输速度(字节/秒) }; ``` --- ## 💻 构建指南 ### 依赖项 - **Qt 6.10+** (需要 Quick 和 Network 模块) - **CMake 3.16+** - **C++17 兼容编译器** ### macOS 构建 ```bash # 克隆仓库 git clone https://gitee.com/DragonCodingPlus/qdlocalshare.git cd DLocalShare # 运行构建脚本 chmod +x build_mac.sh ./build_mac.sh ``` 构建产物位于 `build/mac-release/`: - `DLocalShare.app` - 应用程序包 - `DLocalShare_x.x.x.dmg` - 可分发的 DMG 安装包 **自定义 Qt 路径**: 如果 Qt 安装在非标准位置,编辑 `build_mac.sh` 修改 `QT_DIR` 变量: ```bash QT_DIR="/path/to/your/Qt/6.10.1/macos" ``` ### Windows 构建 ```powershell # 在 PowerShell 中运行 .\build_windows.bat ``` ### 项目结构 ``` DLocalShare/ ├── main.cpp # 应用程序入口点 ├── Main.qml # 主 QML 界面 ├── MainScreen.qml # 主屏幕组件 ├── TransferScreen.qml # 传输列表屏幕 ├── TransferCard.qml # 传输卡片组件 ├── TransferBlockBar.qml # 块进度条组件 ├── DeviceCard.qml # 设备卡片组件 ├── AboutDialog.qml # 关于对话框 ├── CMakeLists.txt # CMake 构建配置 ├── build_mac.sh # macOS 构建脚本 ├── build_windows.bat # Windows 构建脚本 ├── ic_app_icon.png # 应用图标源文件 ├── qrcode_weixin.webp # 微信公众号二维码 ├── i18n/ # 国际化文件 │ └── app_zh.qm # 中文翻译 └── src/ # C++ 源代码 ├── protocol.h/cpp # 协议定义和序列化 ├── deviceinfo.h # 设备信息数据结构 ├── blockinfo.h # 块信息数据结构 ├── transferitem.h/cpp # 传输项数据模型 ├── localgroupmanager.h/cpp # 设备发现管理器 ├── filesender.h/cpp # 文件发送器 ├── filereceiver.h/cpp # 文件接收器 ├── transfermanager.h/cpp # 传输管理器(编排层) ├── devicemodel.h/cpp # 设备列表模型(QML 绑定) ├── transfermodel.h/cpp # 传输列表模型(QML 绑定) └── fileutils.h/cpp # 文件工具函数 ``` --- ## 🔐 权限说明 ### Android (参考实现) | 权限 | 用途 | |------|------| | `INTERNET` | TCP/UDP 套接字通信 | | `ACCESS_WIFI_STATE` | 检测 Wi-Fi 状态 | | `CHANGE_WIFI_MULTICAST_STATE` | 获取多播锁以进行 UDP 多播 | | `WAKE_LOCK` | 传输期间防止 CPU 休眠 | ### 桌面平台等效要求 | 平台 | 网络权限 | 防火墙配置 | |------|---------|-----------| | **macOS** | 需要在 `Info.plist` 中声明网络访问 | 首次运行时系统会提示允许传入连接 | | **Windows** | 无特殊权限要求 | 可能需要在 Windows 防火墙中允许应用 | **注意**: 某些企业级 Wi-Fi 网络可能禁用了多播或限制了设备间通信。如果遇到设备无法发现的问题,请联系网络管理员确认多播和客户端隔离策略。 --- ## 🌍 国际化 DLocalShare 目前支持以下语言: - 🇨🇳 **简体中文** (zh-CN) - 默认语言(当系统语言为中文时) - 🇺🇸 **英语** (en-US) - 默认语言(其他系统语言) --- ## 🤝 贡献指南 欢迎报告问题或提出建议! ### 提交问题 - 描述清楚的问题现象 - 提供复现步骤 - 附上系统环境和应用版本信息 --- ## 📞 联系方式 - **开发者**: [DragonCoding](https://mjlong123.top) - **产品主页**: [DLocalShare](https://mjlong123.top/products/dlocalshare) - **问题反馈**: [Issues](https://gitee.com/DragonCodingPlus/qdlocalshare/issues) ---
**Made with ❤️ by DragonCoding** ⭐ 如果这个项目对您有帮助,请给我们一个 Star!