# 计算机网络lab3_p2p实验 **Repository Path**: TXT85/computer-network-lab3-P2P ## Basic Information - **Project Name**: 计算机网络lab3_p2p实验 - **Description**: 计算机网络实验3 设计并实现一个简单的P2P协议 实验要求是设计并实现一个简单的分布式一致性协议, 每个成员实现自己的一份客户端, 实现小组成员内电脑文件的共享, 文件块传输调度上, 我们参考了bittorrent协议。 客户端的实现上, 我们把程序分为6大模块, 分别为: 1.控制报文模块, 2.文件收发模块, 3.心跳模块, 4.文件片管理模块, 5.调度算法模块, 6.文件拼接模块。 模块间, 使用生产者-消费者模型 进行异步的通信, 使用单例模式来管理模块之间的共享资源, 使用工厂模式来创建连接所需的资源。 客户端间,使用简单封装后的TCP协议进行通信,增加了“分块传输”的服务,使得传输的内容不再是字节流,而是“文件块” - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 2 - **Created**: 2021-04-12 - **Last Updated**: 2023-05-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 模块介绍 ### 简略模块图 ![total_modules0](https://gitee.com/TXT85/computer-network-lab3-P2P/raw/master/readmePic/total_modules0.png) ### 详细模块图 ![total_modules1](https://gitee.com/TXT85/computer-network-lab3-P2P/raw/master/readmePic/total_modules1.png) ## ControlConnectionModule控制报文TCP连接模块 **思路:** 直接与"TCP"连接交互,报文的搬运工 内容: 初始化线程1条,接收线程1条,发送线程1条,"管理map"若干,java bean若干 **功能:** 初始化线程: 建立两个客户端间的文件收发连接,文件收发消息队列,文件收发IO流(实现了初始化自动机) 采用了"异步初始化"(初始化过程中,主函数还可以继续监听新连接)与"工厂模式" **接收线程:** 负责侦听 "来自客户端B" 的控制报文, 并且把不同种类的 [控制报文] 分发给其余模块 发送线程: 时刻监听"控制报文发送消息队列",从消息队列里取出别的模块给 客户端B 的控制报文,并发送给客户端B ![init_thread0](https://gitee.com/TXT85/computer-network-lab3-P2P/raw/master/readmePic/init_thread0.png) ![init_thread1](https://gitee.com/TXT85/computer-network-lab3-P2P/raw/master/readmePic/init_thread1.png) ## FileConnModule文件收发TCP连接模块 **功能:** **ReciveFileThread线程:** (此线程每个客户端3条) 读取从客户端B发来的文件片,然后存入"文件接收队列" 任何时候,接收线程都能接收文件片 !! **SendFilePool发送线程池:** (内部有12条固定线程) 此线程池用于执行"发送"任务 **SendFileThread2发送任务** 此"Runnable类"是提交给发送线程池的发送任务,参数为一个文件块和一个ip地址,即向 ip为ip的客户端B 发送文件块1 (一个任务只发送1个文件块) ## HeartBeatModule心跳模块 **功能:** HeartBeatModule线程: 实现了心跳自动机 **心跳时序图(1.由时序图设计自动机2.代码实现自动机)** ![heart_beat](https://gitee.com/TXT85/computer-network-lab3-P2P/raw/master/readmePic/heart_beat.png) ![heart_beat_timeline](https://gitee.com/TXT85/computer-network-lab3-P2P/raw/master/readmePic/heart_beat_timeline.png) ## FileHoldingModule文件分块持有表模块 **功能:** **FCL_S_Scanner线程:** 1.扫描所有类路径下的 "自己的文件持有表.json" 2.把这些 "自己的文件持有表" 加载进内存,变为FileHoldingListSelf对象,并交给"管理Map"统一管理 **FCL_S_Sender线程:** 定时把 "自己的文件持有表" 发送给所有已连接的客户端 **FCL_S_Receiver线程:** 从FCL_S_ReceiverQueue里面拿出 [别的客户端发过来的 "自己的文件持有表"], 进行处理 ## “自己的文件片持有表” **内容:** 文件名 整个文件md5值 文件是否被完整接收到 文件片数组: [ 文件片序号,文件片md5值,文件片是否持有,文件片路径字符串, 文件片序号,文件片md5值,文件片是否持有,文件片路径字符串 文件片序号,文件片md5值,文件片是否持有,文件片路径字符串 ] **初始化方式:** 1.开机时,会先读取所有 "自己的文件持有表,json"(磁盘) ,,然后在文件夹内扫描文件片,生成自己的 "文件片持有表" 2.进行文件切片制作种子时,会同步生成一个"自己的文件持有表" ![FCL_S](https://gitee.com/TXT85/computer-network-lab3-P2P/raw/master/readmePic/FCL_S.png) ## “全网文件片持有表” **内容:** 文件名 整个文件md5值 文件片数组: [ 文件片序号,文件片md5值,[持有者ip1,持有者ip2], 文件片序号,文件片md5值,[持有者ip1,持有者ip2], 文件片序号,文件片md5值,[持有者ip1,持有者ip2] ] **初始化方式:** 定时向洪流中所有结点请求他们的 "自己的文件片持有表",然后把所有 "自己的文件片持有表" 合并为 "全网文件片持有表" ## DispatchModule调度算法模块 **思路:** 最顶层的算法一切模块的中心 **功能:** 基于"所有其他模块"提供的服务,实现文件块的发送调度控制 (实现了"索要-持有"自动机) ## RcvFileWriteModule把接收到的文件块写入磁盘模块 **功能:** 从"文件接收队列"中取出文件块,并写入磁盘,之后调用"文件合并"函数将接收完的文件合并 # 协议设计 **做出的假设** 1.结点连接后就不掉线 2.所有结点可以互相连接,tcp端口够用,连接数够用 3.内存资源足够大,队列不溢出 # 目前进度 只有”调度算法”模块的线程细节还没完全设计好