前言
最近在追美剧纸牌屋,找到的资源都很高清,一集的大小就到了3-4个G。因为主包的手机USB接口还是2.1(这里提一嘴,REDMI K80 Pro居然还是2.1),导致传输速度很慢。
想了想,有什么办法能够快速的从电脑传输文件到手机呢?看了一下Github交友网站上的项目,大多数都得在电脑和手机上安装软件,才能进行文件的传输。然后我又转头一看,我右手边的路由器。心中一想,能不能在局域网下,用HTTP进行文件的下载呢?
如果使用HTTP的话就需要电脑部署一个服务器,用于文件的下载。手机的话就比较简单了,只需要一个浏览器就可以了,理论都有了,就差实践了。要先看看局域网下,手机和电脑之间的带宽有多大,不然要是比电脑传输的速度还慢就没有弄的必要了。
搭了一个简单的服务器,看内网中下载能否跑满带宽,经过实验发现1G文件下载耗时8秒,相较于电脑的传输速度已经是相当快的了。
数据线:40MB/s | 局域网HTTP:150-300MB/s |
---|---|
![]() | ![]() |
对比下来,还是通过网络(局域网)传输比较快。理论成立,实际运行也成立,那就开干!
服务器
简单的一个文件下载服务器,只需要将文件字节流传输到手机上就可以了。
两个接口:
- 查询目录下文件
- 下载文件
这两个接口的实现都很简单就不展开说了,但是下载文件这个接口用到的技术还是要展开聊聊的。
范围下载
当网络异常时等因素导致下载断开时,通常来说是需要整个文件重新下载的,但是经过我DeepSeek后,发现HTTP有一个Range Requests规范。这个规范的重点在与要求文件服务器根据请求头中的设置,返回文件的部分字节。比如一个视频文件,我(客户端)可以指定服务器只返回49999-58794之间的字节。
这样的功能有啥好处呢?
- 断点续传,我找这个功能就是为了避免文件下载到一半的时候出错还要重新下载的。
- 支持文件的分块下载,也就是客户端能多线程同时下载一个文件,提高下载速度。
实现:
这个规范有几个头部信息需要处理(只挑重要以及关键的实现)
类型 | 名称 | 示例值 | 说明 |
---|---|---|---|
请求头 | Range | bytes=0-124124 | 本次要下载第0个字节到124124字节 |
响应头 | Accept-Ranges | bytes | 表示请求支持范围下载 |
响应头 | Content-Range | 12324-231512/46234524 | 本次请求响应的是文件的12324字节到231512字节,文件总共有46234524字节 |
实现的代码对应Github中的FileService.rangeDownload
方法,我就不大篇幅的在这里讲了。实现完这个规范后,与同样支持Range Requests规范的客户端结合起来使用就能达到上面的效果(目前大部分的浏览器都支持这个规范)。
前端页面
我之前试用过Trae的海外版,在我开发这个下载服务器的时候,Trae的国内版也是出了,刚好试试用了国内大模型的Trae生成速度以及智能性怎么样。
经过我几分钟的使用后,成功的将前端页面生成了出来。
给大家看看生成这个页面总共要几步,可以说大大降低了我这个后端程序员开发前端页面的工作量了。
快速使用
得益于SpringBoot3原生支持GraalVM,所以我们可以很方便的使用GrallVM JDK来编译成可执行文件,启动服务器时无需JDK的依赖。
只需要在pom.xml
文件中编译插件增加下面的插件
xml 代码解读复制代码<plugin>
<groupId>org.graalvm.buildtoolsgroupId>
<artifactId>native-maven-pluginartifactId>
plugin>
然后在安装GrallVM JDK后,命令行执行
bash代码解读复制代码mvn -Pnative native:compile
经过漫长的等待后,你就能得到一个无需任何依赖项的可执行文件,启动后就能部署一个文件下载服务器。
这个编译后的可执行文件我也上传到了仓库中,不想整个仓库拉下来运行的话,可以尝试单个文件执行。
速度对比
开发完了之后,我试了一下整体的下载速度,还是挺快的,能达到147MB/s,但好像这也不是局域网传输速度的上限,但是这篇文章写到这也差不多了,有关速度优化的就留到下一篇文章再写吧。
数据线(速度太慢了就不继续了) | FileDownloadHub-4GB的文件用了大约40秒 |
---|---|
![]() | ![]() |
评论记录:
回复评论: