博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于迷你百度云的解决方案
阅读量:2293 次
发布时间:2019-05-09

本文共 1300 字,大约阅读时间需要 4 分钟。

  最近在做一个小项目算是模拟了FTP文件传输的过程,在这中间遇到了一些问题,今天就来总结一下这些问题顺便提下解决的办法。

一、问题


  (1)客户端在与服务器建立连接后且在传输过程中,若客户端中止后服务器挂掉。

  (2)文件在传输到一半中止后,再次传输,如何传输(即断点续传问题)。
  (3)如何实现类似百度云的秒传功能。
  (4)在实现并发后,若有成千上万个用户同时下载同一个文件时,如何处理。


二、问题分析


  第一个问题:

  首先,为什么在文件传输到一半的时候关掉客户端服务器会挂掉,终归原因是在于我在设计的时候是单方面一直发送,另一方面一直接受,若是两端都正常倒也没什么问题,但若某接受方突然挂掉那么就会导致发送方一直在send()所以进而就导致发送方也挂掉了。
  第二个问题:
  断点续传如何解决,断点续传的问题本质在于再次启动时并不知道上次文件传输到的位置,以及那个文件是不完整文件。解决这两个问题断点续传也就解决了。
  第三个问题:
  要解决第三个问题,就必须了解真正的秒传是怎样实现的,也就是并非真实的去上传,而是服务器端在已有资源的前提下为你提供了一个访问该资源的新接口,看似秒传,实则没传。
  第四个问题:
  很显然,若是访问量一旦飙升特别是对于同一文件,若是并发对其读取且发送是没法实现的。问题本质在于,如何解决多用户同时对于磁盘的某一区域的同时访问。


三、解决问题

  (1)原因分析出来后解决就容易多了,既然是因为发送端不知道接受端挂掉而导致的,那么解决办法也是不唯一的。

   ①最简单的解决办法就是接受一波数据就像发送端回复一声,倘若挂掉自然会给发送端的recv()返回值必然是0,这样就可以解决这个问题了。

   ②稍微复杂一点,效率要比上一种好,就是使用IO复用,一直去监听套接字上的读写事件,因为发送端的写事件是一直是就绪的,所以可以一直发送,但只要接到读事件必然是接受端挂掉或者是其他异常操作导致的。

  (2)解决这个问题方法也不唯一,不过在这里我就只提一种解决方案。

   那就是通过类似操作系统上对于一个打开文件的处理,也就是会去产生一个中间文件。借由这种思路可以在一开始文件传输时,接收方在创建该文件时给其增添后缀标识其为一个未传输完的文件。例如:a.c.tmp运用.tmp去标识,传输完成后再去掉后缀名就ok了。如是挂掉重启,就去找带有.tmp后缀的文件将其文件大小发送给发送方,便可继续正常接受了。

  (3)解决秒传我这目前只有一个思路,就是通过MD5将服务器上所有资源都处理一遍,形成一种Key_Value的映射关系,若是上传的Key值可以查到,则给用户提供一个软连接,可以让其访问,便解决了秒传这个问题。当然这并非完全解决,若是用户是以只读的方式使用该资源倒还罢了,若是要修改资源那便要加入写时拷贝的操作了。

  (4)针对于第四个问题,目前也只有一个思路,就是类似内存池的处理一样。一次性拿到操作系统相应资源,由用户去控制分配。同样适用于这里的问题。之后有时间我再详细的写一篇博客,针对于这最后这一个问题,这里就提一下。

转载地址:http://xisnb.baihongyu.com/

你可能感兴趣的文章
最新“美团+字节+腾讯”三面面经,你能撑到哪一面?
查看>>
三年Java开发,年底跳槽挂了阿里和字节,却收获美团offer,分享大厂面试心得
查看>>
4面全过之后还有交叉面,阿里面试也太“刺激”了
查看>>
手慢无!出自美团内部的精通Java并发编程手册,打倒高并发
查看>>
一线互联网大厂面经分享:阿里三面+头条四面+腾讯二面+美团四面
查看>>
快手三面(Java岗),意向已拿,盘点一下面试官都问了些啥?
查看>>
“刚刚”顺丰校招二面+美团社招三面面经,分享给准备冲刺金三银四的你
查看>>
一个可以拿来直接用的资产管理项目
查看>>
passwd:只能指定一个用户的名称。
查看>>
nginx日志切割和日志清理
查看>>
为什么需要文件服务器?
查看>>
Redis怎么实现主从同步的
查看>>
Spring整理
查看>>
Spring Mvc整理
查看>>
Dubbo整理
查看>>
Redis整理
查看>>
JVM内存模型和类加载机制
查看>>
JDK1.0到12各版本新特性
查看>>
JAVA的一次编译,到处运行。可以在所有的平台上运行?
查看>>
HttpSessionListener监听器
查看>>