GoShare
高性能局域网文件分享工具,Go 语言编写,CS+BS 混合架构。
浏览器 + 专用客户端双通道,单二进制分发,适合 Windows 局域网环境下快速拉取大型文件夹。
特性
- 单二进制 — 一个
goshare.exe 既是服务端也是客户端,零依赖分发
- 双协议支持 — 浏览器 HTTP 访问 + 专用 TCP 客户端,兼顾便捷与性能
- 流式压缩下载 — 浏览器端实时 streaming zip,不落临时文件,大文件夹无内存压力
- 分块流式传输 — 所有文件统一 4MB 分块 + sync.Pool 缓冲区复用,支持超大文件夹(40GB+)
- zstd 压缩 — 自动跳过视频/图片/压缩包等不可压缩格式,节省带宽
- 目录递归遍历 — 自动保留完整目录结构及子文件
- 并发传输 — 多文件并行下载,goroutine 信号量限流,可配置并发数
- 终端进度条 — 实时显示传输速度、进度百分比、剩余时间
- 增量跳过 — 根据文件大小和修改时间自动跳过已存在且一致的文件(1 秒容差兼容 FAT/exFAT)
- 崩溃可观测 — panic recovery + stack trace 日志,异常不再静默退出
安装
通过 winget(推荐)
winget install Orwell-coder.goshare
从 GitHub Release 下载
从 Releases 页面下载最新的 goshare.exe。
通过 go install
go install github.com/Orwell-coder/goshare/cmd/goshare@latest
手动编译
git clone https://github.com/Orwell-coder/goshare.git
cd goshare
.\build.ps1 # PowerShell
# 或
build.bat # CMD
要求 Go 1.22+。
快速开始
1. 启动服务端
在存放文件的电脑上运行:
# 指定目录
goshare serve --root D:\data --root E:\work
# 或使用当前目录(不指定 --root)
goshare serve
未指定 --root,默认使用当前目录: C:\Users\attem\share
========================================
GoShare Server
========================================
HTTP: http://:18080
TCP: tcp://:19090
根目录: C:\Users\attem\share
并发数: 8
分块大小: 4 MB
压缩: true (level 3)
========================================
服务已启动,按 Ctrl+C 停止
2. 下载文件
浏览器方式: 打开 http://<服务器IP>:18080,浏览目录,点击下载按钮。
命令行方式(推荐):
# 查看远程目录
goshare list 192.168.1.100 /data
# 下载整个文件夹
goshare pull 192.168.1.100 /data --output D:\backup
连接到 192.168.1.100:19090...
已连接到 192.168.1.100:19090
获取目录列表: /data
远程目录: 1234 个条目 (1200 文件, 45.6 GB)
需要下载: 15 个文件
[15/15] ████████████████████████████████ 100% 45.6 GB / 45.6 GB 118 MB/s 6m32s
============================================================
完成!总计 15 文件
数据量: 45.6 GB
耗时: 6m32s
平均速度: 119.0 MB/s
============================================================
架构
LAN 局域网
┌──────────┐ ┌──────────────┐
│ 浏览器 │ │ Go CLI 客户端 │
│ (HTTP) │ │ (TCP 二进制) │
└────┬─────┘ └──────┬───────┘
│ :18080 │ :19090
┌────┴───────────────────────┴───────┐
│ GoShare Server │
│ ┌──────────────────────────────┐ │
│ │ File Service Layer │ │
│ │ (并发目录遍历/元数据/校验和) │ │
│ └─────────────┬────────────────┘ │
│ ┌─────────────┴────────────────┐ │
│ │ Transfer Engine │ │
│ │ (分块流式/并发传输/zstd压缩) │ │
│ └─────────────┬────────────────┘ │
│ ┌─────────────┴────────────────┐ │
│ │ HTTP Handler │ TCP Handler │ │
│ └───────────────┴──────────────┘ │
└────────────────────────────────────┘
协议
| 协议 | 端口 | 用途 | 编码 |
|---|
| HTTP | 18080 | 浏览器浏览+下载 | streaming zip |
| TCP | 19090 | CLI客户端高速传输 | gob控制帧 + raw二进制数据块 |
TCP 协议帧格式:
控制消息: [Type:1B] [gob payload]
数据块: [Type:1B] [PathLen:2B] [Path] [Offset:8B] [DataLen:4B] [Data] [IsLast:1B]
命令行参考
goshare serve — 启动服务端
| 参数 | 短参数 | 默认值 | 说明 |
|---|
--root | -r | 当前目录 | 允许访问的根目录(可多次指定) |
--http | -H | :18080 | HTTP 监听地址 |
--tcp | -T | :19090 | TCP 监听地址 |
--concurrency | -n | 8 | 并行传输文件数 |
--chunk-size | -k | 4 | 分块大小 (MB) |
--large-threshold | -l | 16 | 大文件阈值 (MB) |
--compress | — | true | 启用 zstd 压缩 |
--no-compress | — | false | 禁用 zstd 压缩 |
--compress-level | -z | 3 | zstd 压缩级别(1=最快, 22=最优) |
--rate-limit | -R | 0 | 限速 MB/s(0=不限) |
所有命令均支持 -h / --help 查看自动生成的帮助。
goshare pull — 下载文件夹
goshare pull <主机IP> <远程路径> [flags]
| 参数 | 短参数 | 默认值 | 说明 |
|---|
--output | -o | 远程路径名 | 本地输出目录(默认取远程路径最后一段) |
--port | -p | 19090 | TCP 端口 |
--concurrency | -c | 8 | 并行下载数 |
goshare list — 列出远程目录
goshare list <主机IP> <远程路径> [flags]
| 参数 | 短参数 | 默认值 | 说明 |
|---|
--port | -p | 19090 | TCP 端口 |
性能策略
| 策略 | 说明 |
|---|
| 统一分块流式 | 所有文件统一 4MB 分块读取,不按大小区分路径,sync.Pool 复用缓冲区 |
| 并发控制 | goroutine 信号量限流,默认 8 路并发 |
| zstd 压缩 | level 3,自动跳过 .zip/.jpg/.jpeg/.png/.mp4/.mkv/.avi 等已压缩格式 |
| 连接复用 | TCP 长连接,多文件复用同一连接 |
| TCP 调优 | TCP_NODELAY + 1MB Read/Write Buffer |
| Panic 防护 | HTTP handler + TCP session 双重 panic recovery,异常带 stack trace |
增量下载
客户端下载前会比对远程文件列表与本地文件:
- 大小 + 修改时间一致 → 跳过(1秒时间容差,兼容 FAT/exFAT)
- 不一致或不存在 → 下载
如需强制全量覆盖,删除本地目标目录后重新下载即可。
技术栈
| 组件 | 选型 |
|---|
| 语言 | Go |
| 序列化 | gob (控制消息) + raw binary (数据块) |
| 压缩 | klauspost/compress zstd |
| HTTP | net/http (标准库) |
| 终端 | Windows Console API |
限制 & 说明
- 仅支持单向下载(Server → Client),不支持双向同步
- 完全信任局域网环境,无认证/加密
- 端口默认 18080/19090,可通过命令行调整以避免冲突
- 目前仅在 Windows 上编译和测试,Linux/macOS 需替换
sendfile_windows.go 中的平台相关实现
License
MIT