【项目】P2P文件快传

一、概要

1、需求定档

功能:让网络上任意两台主机之间可以互相下载共享文件

2、概要设计

(1)网络上任意两台主机共享
首先要直到在网络上有哪些主机能够建立共享关系
(2)从一个指定的主机上去下载自己想要的文件,也可以将自己的文件提供给别人下载

3、模块功能框架

【项目】P2P文件快传

4、功能流程图

【项目】P2P文件快传

二、详细讲述P2P下载器

1、包含模块

  • 客户端
    查看网络上有哪些共享主机
    向网络中广播配对请求,得到响应
    获取指定主机文件列表
    向指定主机发送获取列表请求
    从指定主机上下载文件
    向指定主机发送下载指定文件的请求
  • 服务端
    针对客户端的功能做出正确响应提供服务即可

2、客户端功能流程

(1)获取网卡信息——》获取主机IP+MASK——》得到局域网IP列表
(2)向所有IP发送配对请求——》得到在线主机列表
(3)选择一个主机IP发送获取文件列表请求——》得到获取到的共享的文件列表
(4)从这个主机IP 下载指定的共享主机

3、服务端功能流程

(1)接收到主机配对请求,则做出一个200响应(说明主机在线)
(2)接收到文件列表请求

  • 检测获取指定的共享目录下的文件信息
  • 将所有文件名组织成http相应正文
    (3)接收到指定的文件下载请求
  • 通过文件名检测文件是否存在
  • 检测文件受否是一个普通文件
  • 如果存在并且正确,则打开文件,获取文件数据,作为http响应正文响应给客户端

三、项目中用到的重要技术

1、分块传输

(1)断点续传
网页上的断点续传其实就是通过分块下载完成的。
断点续传:当正在下载文件的时候,突然网络中断,导致文件没有下载完毕而失败,等到下次网络通畅的时候,可以继续从上次断开的位置开始重新下载文件。而不需要重新将完整的文件下载一次,来提高异常情况下文件的传输效率。
(2)断点续传是如何实现的?
文件下载过程中单独开启一个文件,每隔一会儿就记录一下当前已经下载了多少数据,这时如果网络断开,下次下载就知道从哪里下载了。下次继续下载的时候就需要告诉服务端到底应该从哪里开始传输,这样服务端知道从哪里开始传输数据,就不需要对已经传输过的数据重新二次传输。
(3)但是在此项目中暂不实现断点续传,会用到分块传输
因为当前我们的文件传输都是一次性读取/写入文件数据,相当于定义了一个与文件大小相同的buffer,这时如果文件大小非常大,则会造成严重问题:
(1)内存有点不够用,则会大量使用交换分区交换内存,而这种大量内存交换会造成效率低下。
(2)内存耗尽,程序崩溃。
为了解决以上问题,最好使用分块传输。(每次只向服务器请求文件的一部分)

2、网络穿透原理

(1)当前所写的P2P下载器项目是一个局域网的P2P,无法实现整个网络的p2p。因为局域网之间无法跨网络进行数据传输
就算已知对方的私网地址,但是因为我们并没有网络直连,因此无法直接通信。所以局域网之间想要进行通信就要借助网络穿透技术实现
(2)网络穿透技术实现是让两个局域网主机之间不需要经过一个中转服务器进行数据转发而实现通信。即,借助一个公网服务器(但是这个公网服务器并不实现数据的转发)

代码实现P2P文件快传