一、背景

最近出于工作需要,我经常需要在设备之间传输大的视频文件。这时问题出现了。使用微信的聊天功能发送文件,微信会对文件压缩,并且传输得非常慢。当传输的文件过大时,它还会禁止发送。 使用网盘传输不会限制传输的大小,但是上传下载的速度很慢,特别是没有会员的情况下就更慢了。 使用AirDrop可以方便快速地传输文件,苹果设备之间必选方案。我的设备有Android手机,有windows电脑。AirDrop没有用武之地了。 我也尝试过使用其他工具,比较流行的就属LocalSend了。LocalSend支持多平台局域网传输文件。经过深度使用后我发现传大文件的速度太慢,而且在发生中断的情况下不能断点续传。

二、DLocalShare使用自定义传输协议实现跨端文件传输

在局域网内,设备之间传输文件,主要考虑两方面问题,一个是设备发现,一个是文件传输。

  • • 1.设备发现主要依赖局域网内的组播技术。应用启动后加入固定的组播,同时向组播中发送注册设备的信息。文件接收端加入组播,接收组播信息,用于识别可接收文件的设备。239.0.0.0~239.255.255.255 是局域网可用的组播网段。49152 ~ 65535 是组播端口号可以选择的区间。路由器需要支持IGMP。

  • 图片

  • • 2.文件传输采用TCP长连接。通过组播发现设备后,能够得到接收设备的IP地址和ServerSocket的端口号。发送端使用Socket直接连接。发送端建立连接后,会将文件信息头帧发送给接收端。获取到文件信息头后,接收端在本地查询是否是中断文件,如果是中断文件,将中断信息反馈给发送端。发送端接到反馈后,根据反馈信息实现断点续传。

  • 图片

三、DLocalShare解决了什么问题。

  • • 1.设备发现更迅速

采用自定义组播的方式实现设备注册和发现,发现设备更迅速。设备发送注册帧,信息包括设备名称,设备ip地址,ServerSocket监听端口号。组内的其他设备接收到注册帧后会发送一个反馈帧,反馈帧也将自己的设备信息发送到组内。只有接收到注册帧后才会有反馈帧,避免组播风暴发生。当有设备离开时发送一个退出帧,其他设备根据退出帧更新设备列表。整个流程非常的快速,设备发现也特别的快。

  • • 2.采用TCP连接传文件更快速

采用传输层协议传输文件更高效,避免了应用层、表示层、会话层的层层封装。数据流传输更高效,避免过多的数据头追加,连接的协商过程等。

  • • 3.实现多线程传输

将发送的文件按照线程数分块传输,一个线程只负责一块数据的传输,接收端接收块数据写入到本地文件。多线程方式传输可以充分地利用网络带宽,磁盘的读写带宽。传输文件速度更快。

  • • 4.支持断点续传功能

文件传输过程中,接收端设备实时记录接收的进度,将进度保存到meta文件中。当发生中断后执行重传时,发送端向接收端发送查询帧,接收端将meta文件的信息整理成反馈帧回传给发送端,发送端根据反馈帧进行断点续传。断点续传功能解决了大文件中断重传的问题。

四、如何使用DLocalShare传文件

  • • 1.接收设备打开DLocalShare,停留在等待接收文件的画面。

  • 图片

  • • 2.点击更改目录按钮可以修改默认保存目录,接收的文件直接保存到这个目录。

  • • 3.发送端设备进入系统图库或文件管理器,选择要发送的文件,点击发送按钮。

  • • 4.在发送选择应用页面选中DLocalShare后进入DLocalShare的选择设备画面。

  • 图片

  • • 5.选择设备画面中指定一个设备,然后点击发送按钮。发送画面展示发送进度和状态。

  • 图片

  • • 6.接收端设备自动跳转到接收画面,接收画面展示接收进度和状态。

  • • 7.发送文件过程中,如果发生了中断,发送端设备的发送界面会显示意外中断信息,点击刷新按钮实现断点续传。

五、计划

DLocalShare暂时只开发了安卓的版本。后面计划陆续开发支持Windows和Mac电脑。想要尝鲜的朋友可以关注我,我会将后续的进度也进行分享。针对这个应用有什么建议,您可以给我留言。

下载

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐