Futter开源项目-局域网文件共享终端
速享系列文章:
- 用 Flutter 开发一个局域网互传文件的 App!
- [Futter开源项目-局域网文件共享终端]:
此文
背景
我只想以一种更优雅的方式解决局域网中文件的互传,当然目前已经有很多出名的软件,例如 landrop 等,但我觉得,并不如人意。
landrop 安卓端也由 Flutter 编写
速享看起来并不复杂,但他其实花费了我近半年的开发时间,从在北京实习的时候,每天回家写,周末写,从最初有一个小的念头开始,我遍创建了这个名为 speed_share 的仓库,一周的时间,有了它的第一个版本,长这样。
然后第二个版本
第三个
再到今天的版本。
截图
功能特性
- 文件互传
- 像聊天一样在局域网共享文件
- 断点续传
- 图片预览,视频极速在线播放
- 点对点高速下载,不使用服务器中转
- 多个设备同时分享与查看
- 文件夹共享(重构中)
- 文件分类: 将接受到的文件按扩展名进行分类
- 拖拽共享文件
- 剪切板共享
- 远程文件管理
- 可视化浏览
- 删除,重命名
- 快速连接
- UDP 自动连接
- 扫码连接
- 输入连接
- 历史连接
- 文件静态部署:类似 tomcat 或者 nginx,方便设备间使用浏览器查看文件,访问网页
- 支持浏览器加入客户端
- 支持多平台:Android、Windows、macOS、Linux
- 响应式设计:适配各种尺寸,平板、手机、横竖屏切换自动适配布局
- 支持Android SAF:可以接收任意App分享的文件
截图
全新的功能界面,
文件互传
文件互传作为速享最核心的功能,也是经过了较久的打磨,消息互传的实现,也经过了几个阶段的重构,由最初的 WebSocket 设计重构成 C/S 架构,所有消息的首发均通过 http 协议,这主要是防止速享处于后台被国产系统断开长连接的问题。
像聊天一样
发送普通文件、图片、视频,文本,只需要像聊天一样。
断点续传
避免大文件下载中断,无法继续下载的情况,得益于本人对 dart 官方库 shelf 的代码共享。
图片、视频预览
这个问题主要还是学了后端的一些知识才解决,学了文件断点续传的原理,服务端代码如何实现的细节,最后发现用到的 shelf_static 缺少响应 range 头的这一核心功能,最后给仓库提交了 pr,才完成了这个功能的实现。
高速下载
文件分类
剪切板共享
起初的剪切板共享是通过轮询本机剪切板,再通过 HTTP 协议共享给其他端实现的,但是最后发现这种方式有很多弊端,例如长时间没有剪切板仍导致的 CPU 占用,剪切板共享不及时等,后来通过大佬们的插件 clipboard_watcher
实现桌面端的剪切板监听,通过 ClipboardManager
的 addPrimaryClipChangedListener
方法实现 Android 端的剪切板监听。
剪切板提供设置开关,不需要可以关闭,即不会读取剪切板
由于剪切板属于隐私信息,如果你对应用市场的版本不放心,你可以尝试编译速享的开源版,来保证隐私的安全性。
远程文件管理
通过 C/S 的架构设计,将文件管理器的基本实现封装成 HTTP 服务端,客户端只需要借助 HTTP 接口即可完成简单文件管理器的展示。
快速连接
文件静态部署
静态文件部署可开关
浏览器加入客户端
速享将自身编译为 web 端,集成到所有客户端的 assets 中,启动时解压到数据目录并通过 shelf 进行部署,这样同一局域网下的任意浏览器都可通过指定端口打开速享网页端,在一方有客户端,另一方没有的情况下,也能进行互传。
支持多平台
得益于框架本身的特性,Flutter 可以快速支持多尔平台,虽然仍然不能避免需要对每个平台进行不同的适配。
响应式设计
使用自研的简单屏幕适配,与其他屏幕适配的 Flutter App 不同的是,app 不会因为屏幕的变大而无条件的缩放,当达到大屏的临界点时,会命中桌面端的尺寸方案,同时借助 responsive_framework
更方便的为不同的屏幕响应不同的布局。
支持Android SAF
这也是用户们反馈得比较多的问题,最后得到解决。
文件部署
类似于 Nginx 和 Tomcat 自带的文件部署,如果你需要在局域网的其它设备查看本机的静态网页,或者批量浏览文件,则会用到这个功能。手机端可通过此功能查看其他设备的文件,浏览其他设备的网页。
视频丝滑播放
播放就跟本地一样,这也是我用得比较多的功能,有时候想在大屏幕上看视频,一般又是手机端下载。
点对点高速传输
速享不使用任何的服务器,所有传输都是点对点直接互传,下载文件可显示网速,下载进度。
在 macOS 作为发送端,其它设备下载的场景下,网速可达到 70mb/s。如果在客户端内下载速度较慢,可以复制下载链接到浏览器进行下载。
播放就跟本地一样,这也是我用得比较多的功能,有时候想在大屏幕上看视频,一般又是手机端下载。
项目状态
状态 | 描述 |
---|---|
酷安下载量 | 3w+ |
仓库代码量 | 1.5w line+ |
Git 增删情况 | 57196 ++/38043 – |
结语
以一人之力,的确做不出太完美的东西,在细节上总会有些瑕疵
Q&A
为什么是Flutter?
关于这个必问的问题,在这里我也许会给出一个别人很少给过的答案,我需要一个人支撑多个项目,处理数10w甚至数100w的代码,需要支撑多个平台,需要极高的开发效率,对我来说,没有别的选择。
很久不写文章了,我慢慢变成了大多数人的样子,每天睁眼闭眼上班,下班后不碰代码,这一天总算是到来了。
我是梦魇兽,2022应届生,滴滴出行国际化终端架构研发。
我不太执着于工作,所以当我第一次获得正式 offer 后,我就选择了躺平,我会正常工作,直到离职。
从公司实习会学校后生病了,养病的半年,想通了很多以前都没有想通的事,对生命,对生活,对人。
前段时间呢回公司上班了,剩下开发个人项目的时间就更少了,空闲时间还要处理学校毕业的事情,所以包括无界在内的多款个人产品都是停更的状态。上一秒还在公司会议,下一秒打开微信看青年大学习,我们每个人都会做着毫无作用但又不得不做的事。也许是以一个学生的身份,也许以一个老师,也许是以一个程序员。
当我写下这段话已经是发布这篇文章的几个月前了,所以我现在已经正式工作了
其实世上有技术的人,比比皆是,更多的是在于大家的选择,我也想像大家一样下班就玩玩游戏,看看电视,弹弹琴,唱唱歌,世界会少什么,会多什么,与我无关,这也是大部分人的想法,所以,即使现在在我们的生活中有各种各样的痛点,但仍然不会有人站出来解决。
Futter开源项目-局域网文件共享终端
http://blog.nightmare.press/2022/09/26/Futter开源项目-局域网文件共享终端/