欢迎来到天天文库
浏览记录
ID:40499354
大小:53.85 KB
页数:23页
时间:2019-08-03
《多线程断点续传(俗称分段下载)》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、一种点对点文件断点续传的多线程实现方法1概述 文件断点续传就是在主机与主机间传输文件时,可以将文件分多次传输,与非断点续传不同的是,每次传输不必传输整个文件。断点续传是大型文件数据传输的核心。本文将以多线程技术和Socket技术为依托,介绍大型文件断点续传的实现方法。 2基本实现思想 多线程断点续传实现的基本思想就是在发送端(也称客户端)将要传输的文件分割为大小相当的多块,用多个线程,将这些块同时向目标服务器端发送;在服务器端的服务程序监听数据传输请求,每当接到新的请求,则创建一个新的
2、线程,与客户端的发送线程对应,接收数据,记录数据传输进程。 图1 点对点文件断点续传过程示意图 图1是点对点文件断点续传第N块传输过程示意图。在传输发起端(客户端),将大型文件事先分割为大小相当的N块,同时创建N个传输线程,连接目标端服务器。当服务器端接收到每一个连接请求后,告知客户端可以传输文件。当客户端接收到可以传输文件的消息时,首先向服务器发送数据传输信息块(包括第几块、在块中的起始位置)请求,当服务器端接收到该请求后,向客户端发送数据传输信息,客户端然后传输数据传输信息块指定的数据
3、给服务器端,服务器端更新数据传输信息块。 3具体实现 在实现过程中我使用了MFC的多线程和Windows的Socket,分客户端和服务器端实现。因为数据传输往往是对等的,所以需要将客户端和服务器端集成在一起,在客户端和服务器端分别实现后,这是件非常简单的工作,只需将它们集成在一起即可。下面将分别介绍客户端和服务器端的实现。 3.1关键数据结构 文件信息数据结构用于在服务器端和客户端之间传递文件第N块的属性信息,详细定义如下: structfileinfo { intfi
4、leno;//文件号 inttype;//消息类别 longlen;//文件(块)长度,在客户端向服务器端发送数据时,是文件长度; //在服务器端向客户端发送已传部分的信息时,是应该续传部分的长度; longseek;//开始位置,标识要传输数据在原文件中的起始位置 charname[MAX_PATH_LEN];//文件名 }; 发送进度记录结构用户记录文件传输进程,详细定义如下: structSentInfo { longtotle;//已经成功发送数据的
5、长度; intblock;//块标识; longfilelen;//文件总长度; intthreadno;//负责传输第N块数据的线程标识; CStringname;//文件名称 }; 客户端类客户端文件发送实例封装,用户记录客户端文件发送过程中的属性信息、已发送大小、发送线程句柄、发送线程状态、发送统计信息等,具体定义是: classCClient:publicCObject { protected: //Attributes public:
6、 CClient(CStringip); ~CClient(); SentInfodoinfo; longm_index;//块索引 BOOLsendOk[BLOCK];//块发送结束状态 CStringSendFileName; CStringDestIp;//目标IP地址 THREADSTATUSSendStatus; intGetBlockIndex();//获取当前要传输文件块的序号,例如0,1,2… CCriticalSectionm_gCS;
7、 //SendingFileBlockThreadHandles HANDLEm_thread[BLOCK];//BlockSendingThreadHandlesArray HANDLEm_ExitThread;//WaitToExitThreadHandle HANDLEm_ProcessTrackThread; HANDLEm_hEventKill;//UsercanceledEvent longm_IdxInListCtrl;//IndexinListView l
8、ongm_lBeginTimeTick; longm_lBytesSent; //Operations public: }; 3.2客户端 发送线程用于发送由lpparam参数指定的Client对象标识的文件块数据。具体实现是: //发送线程主函数 //并行进行的线程,针对每个要发送的文件有BLOCK个该线程 DWORDWINAPISendThread(LPVOIDlpparam) { CClient*pClient=(CClient*)
此文档下载收益归作者所有