多线程断点续传(俗称分段).docx
文本预览下载声明
一种点对点文件断点续传的多线程实现方法1 概述??? 文件断点续传就是在主机与主机间传输文件时,可以将文件分多次传输,与非断点续传不同的是,每次传输不必传输整个文件。断点续传是大型文件数据传输的核心。本文将以多线程技术和Socket技术为依托,介绍大型文件断点续传的实现方法。??? 2 基本实现思想??? 多线程断点续传实现的基本思想就是在发送端(也称客户端)将要传输的文件分割为大小相当的多块,用多个线程,将这些块同时向目标服务器端发送;在服务器端的服务程序监听数据传输请求,每当接到新的请求,则创建一个新的线程,与客户端的发送线程对应,接收数据,记录数据传输进程。??? 图1? 点对点文件断点续传过程示意图??? 图1是点对点文件断点续传第N块传输过程示意图。在传输发起端(客户端),将大型文件事先分割为大小相当的N块,同时创建N个传输线程,连接目标端服务器。当服务器端接收到每一个连接请求后,告知客户端可以传输文件。当客户端接收到可以传输文件的消息时,首先向服务器发送数据传输信息块(包括第几块、在块中的起始位置)请求,当服务器端接收到该请求后,向客户端发送数据传输信息,客户端然后传输数据传输信息块指定的数据给服务器端,服务器端更新数据传输信息块。??? 3 具体实现??? 在实现过程中我使用了MFC的多线程和Windows的Socket,分客户端和服务器端实现。因为数据传输往往是对等的,所以需要将客户端和服务器端集成在一起,在客户端和服务器端分别实现后,这是件非常简单的工作,只需将它们集成在一起即可。下面将分别介绍客户端和服务器端的实现。??? 3.1 关键数据结构??? 文件信息数据结构 用于在服务器端和客户端之间传递文件第N块的属性信息,详细定义如下:??? structfileinfo??? {??? int fileno; //文件号??? int type; //消息类别??? long len; //文件(块)长度,在客户端向服务器端发送数据时,是文件长度;??? //在服务器端向客户端发送已传部分的信息时,是应该续传部分的长度;??? long seek; //开始位置,标识要传输数据在原文件中的起始位置??? char name[MAX_PATH_LEN];//文件名??? };??? 发送进度记录结构 用户记录文件传输进程,详细定义如下:??? structSentInfo??? {??? long totle; //已经成功发送数据的长度;??? int block; //块标识;??? long filelen; //文件总长度;??? int threadno; //负责传输第N块数据的线程标识;??? CString name; //文件名称??? };??? 客户端类 客户端文件发送实例封装,用户记录客户端文件发送过程中的属性信息、已发送大小、发送线程句柄、发送线程状态、发送统计信息等,具体定义是:??? classCClient:publicCObject??? {??? protected:?????? //Attributes??? public:??? CClient(CString ip);??? ~CClient();??? SentInfo doinfo;??? long m_index; //块索引??? BOOL sendOk[BLOCK]; //块发送结束状态??? CString SendFileName;??? CString DestIp; //目标IP地址??? THREADSTATUS SendStatus;??? int GetBlockIndex(); //获取当前要传输文件块的序号,例如0,1,2…??? CCriticalSection m_gCS;?????? //Sending File Block Thread Handles??? HANDLE m_thread[BLOCK]; //Block Sending Thread Handles Array??? HANDLE m_ExitThread; //WaitToExitThread Handle??? HANDLE m_ProcessTrackThread;??? HANDLE m_hEventKill; //User canceled Event??? long m_IdxInListCtrl; //Index in ListView??? long m_lBeginTimeTick;??? long m_lBytesSent;??? // Operations??? public:??? };??? 3.2 客户端??? 发送线程 用于发送由lpparam参数指定的Client对象标识的文件块数据。
显示全部