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 实现桌面端的剪切板监听,通过 ClipboardManageraddPrimaryClipChangedListener 方法实现 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 后,我就选择了躺平,我会正常工作,直到离职。

从公司实习会学校后生病了,养病的半年,想通了很多以前都没有想通的事,对生命,对生活,对人。

前段时间呢回公司上班了,剩下开发个人项目的时间就更少了,空闲时间还要处理学校毕业的事情,所以包括无界在内的多款个人产品都是停更的状态。上一秒还在公司会议,下一秒打开微信看青年大学习,我们每个人都会做着毫无作用但又不得不做的事。也许是以一个学生的身份,也许以一个老师,也许是以一个程序员。

当我写下这段话已经是发布这篇文章的几个月前了,所以我现在已经正式工作了

其实世上有技术的人,比比皆是,更多的是在于大家的选择,我也想像大家一样下班就玩玩游戏,看看电视,弹弹琴,唱唱歌,世界会少什么,会多什么,与我无关,这也是大部分人的想法,所以,即使现在在我们的生活中有各种各样的痛点,但仍然不会有人站出来解决。

作者

梦魇兽

发布于

2022-09-26

更新于

2023-05-27

许可协议

评论