[文章信息]
作者:upload/2004_06/04062118573143.zip

在如今的网络应用中,文件的传送是重要的功能之一,也是共享的基础。一些重要的协议像HTTP,FTP等都支持文件的传送。尤其是FTP,它的全称就是“文件传送协议”,当 初的工程师设计这一协议就是为了解决网络间的文件传送问题,而且以其稳定,高速,简单而一直保持着很大的生命力。作为一个程序员,使用这些现有的协议传送文件相当简单,不过,它们只适用于服务器模式中。这样,当我们想在点与点之间传送文件就不适用了或相当麻烦,有一种大刀小用的意味。笔者一直想寻求一种简单有效,且具备多线程断点续传的方法来实现点与点之间的文件传送问题,经过大量的翻阅资料与测试,终于实现了,现把它共享出来,与大家分享。
我写了一个以此为基础的实用程序(网络传圣,包含源代码),可用了基于TCP/IP的电脑上,供大家学习。
upload/2004_06/04062118541204.gif

(本文源代码运行效果图)


实现方法(VC++,基于TCP/IP协议)如下:
仍釆用服务器与客户模式,需分别对其设计与编程。
服务器端较简单,主要就是加入待传文件,监听客户,和传送文件。而那些断点续传的功能,以及文件的管理都放在客户端上。

点对点(P2P)多线程断点续传的实现 一、服务器端

首先介绍服务器端:
最开始我们要定义一个简单的协议,也就是定义一个服务器端与客户端听得懂的语言。而为了把问题简化,我就让服务器只要听懂两句话,一就是客户说“我要读文件信息”,二就是“我准备好了,可以传文件了”。
由于要实现多线程,必须把功能独立出来,且包装成线程,首先建一个监听线程,主要负责接入客户,并启动另一个客户线程。我用VC++实现如下:

点对点(P2P)多线程断点续传的实现DWORD WINAPI listenthread(LPVOID lpparam)

接着我们来看用户线程:
先看文件消息类定义

点对点(P2P)多线程断点续传的实现struct fileinfo

用户线程函数:

点对点(P2P)多线程断点续传的实现DWORD WINAPI clientthread(LPVOID lpparam)

 

读文件函数

点对点(P2P)多线程断点续传的实现void readfile(SOCKET  so,int seek,int len,int fino)

服务器端最要的功能各技术就是这些,下面介绍客户端。

点对点(P2P)多线程断点续传的实现 二、客户端

客户端最重要,也最复杂,它负责线程的管理,进度的记录等工作。

大概流程如下:
先连接服务器,接着发送命令1(给我文件信息),其中包括文件长度,名字等,然后根据长度决定分几个线程下载,并初使化下载进程,接着发送命令2(可以给我传文件了),并记录文件进程。最后,收尾。
这其中有一个十分重要的类,就是cdownload类,定义如下:

点对点(P2P)多线程断点续传的实现class cdownload  

 

下面先介绍sendrequest(int n),在开始前,向服务器发获得文件消息命令,以便让客户端知道有哪些文件可传

点对点(P2P)多线程断点续传的实现int cdownload::sendrequest(int n)

 

有了文件消息后我们就可以下载文件了。在主函数中,用法如下:

点对点(P2P)多线程断点续传的实现//下载第clno个文件,并为它建一个新cdownload类
点对点(P2P)多线程断点续传的实现
down[clno]=new cdownload(clno);
点对点(P2P)多线程断点续传的实现
//开始下载,并初使化
点对点(P2P)多线程断点续传的实现
type=down[clno]->startask(clno);
点对点(P2P)多线程断点续传的实现
//建立各线程
点对点(P2P)多线程断点续传的实现
createthread(clno);

下面介绍开始方法:

 

点对点(P2P)多线程断点续传的实现//开始方法
点对点(P2P)多线程断点续传的实现
int cdownload::startask(int n)

下面介绍建立各进程函数,很简单:

点对点(P2P)多线程断点续传的实现void CMainFrame::createthread(int threadno)

downthread进程函数

点对点(P2P)多线程断点续传的实现DWORD WINAPI downthread(LPVOID lpparam)

下面介绍下载进程函数,最最核心的东西了

 

点对点(P2P)多线程断点续传的实现UINT cdownload::threadfunc(long index)

到这客户端的主要模块和机制已基本介绍完。希望好好体会一下这种多线程断点续传的方法。

作者信息:
姓名:赵明
email: papaya_zm@sina.com 或 zmpapaya@hotmail.com
主页: http://h2osky.126.com

相关文章:

  • 2022-12-23
  • 2021-11-02
  • 2021-07-12
  • 2021-10-27
猜你喜欢
  • 2021-06-29
  • 2021-12-29
  • 2021-09-24
  • 2021-12-06
  • 2022-02-10
相关资源
相似解决方案