为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

下载工具开发

2017-10-23 50页 doc 613KB 9阅读

用户头像

is_353097

暂无简介

举报
下载工具开发下载工具开发 下载工具的设计与开发 摘要 在BT软件以及电驴等P2P工具日益发展的今天,不管你有多少带宽他都会100%的占用。这类P2P软件的下载速度完全依赖带宽,然而,如何在不提高带宽的前提下提高局域网的下载速度是一个符合实际的问题,本文就基于该问题提出并实现了“分布式下载工具”系统。该系统很好的解决了局域网被限速的问题,大大提高了下载速度。 “分布式下载工具”联合局域网内的几台客户机同时去下载Internet网上的同一资源的不同数据块,下载完后按顺序统一整合。它有下载客户机与服务器的功能,分别运用VC和VB.Net...
下载工具开发
下载工具开发 下载工具的与开发 摘要 在BT软件以及电驴等P2P工具日益发展的今天,不管你有多少带宽他都会100%的占用。这类P2P软件的下载速度完全依赖带宽,然而,如何在不提高带宽的前提下提高局域网的下载速度是一个符合实际的问题,本文就基于该问题提出并实现了“分布式下载工具”系统。该系统很好的解决了局域网被限速的问题,大大提高了下载速度。 “分布式下载工具”联合局域网内的几台客户机同时去下载Internet网上的同一资源的不同数据块,下载完后按顺序统一整合。它有下载客户机与服务器的功能,分别运用VC和VB.Net开发设计。客户机完成下载与连接其他用户的功能;而服务器则管理用户和资源情况,供客户机提供在线用户的数据,并且服务器能够对用户和资源进行控制。比如:封锁某些不合法的资源、禁止某些不合法的用户使用等。 本系统设计完成后,并与其他下载软件进行了测试比较,提升效果明显,有一定推广使用价值。 关键词:下载速度;下载软件;局域网 The Development of Distributed Download Tool ABSTRACT P2P download tools like BT and e-Mule became increasingly developed nowadays. No matter how much bandwidth you have, 100 percent fully of it will be the occupied. Download speed of such p2p software is totally depends on the bandwidth. However, how to boost speed of LAN on the actuality of bandwidth is a practical issue .this article expatiates from such issue and actualize “distributed download tool” system. This system has a very good solution to the limited LAN, strongly improving the download speed. The "Distributed download tool”, is a technology to join several clients at the same time to download different data blocks from the some resources on the Internet, and each client reunifies these blocks a completed file. The system can act as client and server both, respectively, with VC and VB.Net to exploit and design. As a client it does download work and connects with other users; while being the server, it manages the users and resources for the client and provides online data. Besides, the server can control users and resources. Compared with other download software, a completed “Distributed download tool” system upgrades download speed significantly and is of good popularization value. Key words: Download Speeds; Download Software; Local Area Networks 目录 第一章 前言 .............................................................. 1 1.1项目简单介绍 ........................................................................................................... 1 1.2 项目特点 ................................................................................................................. 1 1.3 项目开发背景 .......................................................................................................... 2 1.4 项目的创新性 .......................................................................................................... 2 1.5 项目开发的总目标 .................................................................................................. 2 第二章 需求分析 ......................................................... 3 2.1 功能需求 ................................................................................................................. 3 2.2 性能需求 ................................................................................................................. 3 2.3 系统数据流图 .......................................................................................................... 4 2.3.1 系统总体数据流图 ........................................................................................ 4 2.3.2 服务器端数据流图 ........................................................................................ 5 2.3.3客户端数据流图 ............................................................................................. 6 第三章 概要设计 .......................................................... 9 3.1 系统结构设计 .......................................................................................................... 9 3.1.1 系统结构示意图 ............................................................................................ 9 3.1.2 系统组织模块结构图 ..................................................................................... 9 3.1.3 系统HIPO ............................................................................................... 10 3.2 接口设计 ............................................................................................................... 11 3.2.1 用户界面接口 .............................................................................................. 11 3.2.2 软件系统接口 .............................................................................................. 13 3.2.3 软件内部接口 .............................................................................................. 13 3.3 数据库设计 ............................................................................................................ 13 第四章 详细设计 ......................................................... 15 4.1基本设计概念和处理流程 ..................................................................................... 15 4.2 关键技术代码 ........................................................................................................ 17 第五章 系统的关键技术和难点 ............................................. 28 5.1 MFC消息传递机制技术 ........................................................................................ 28 5.2 VC Socket通讯技术 ............................................................................................... 28 5.3 VC多线程技术 ...................................................................................................... 29 第六章 软件测试与改进思想 ............................................... 30 6.1 软件测试 ............................................................................................................... 30 6.2 软件改进思想 ........................................................................................................ 31 第七章 安装与使用说明 ................................................... 32 7.1 服务器端安装说明 ................................................................................................ 32 7.2 服务器端操作说明 ................................................................................................ 34 7.3 客户端的安装说明 ................................................................................................ 38 7.4 客户端使用说明 .................................................................................................... 41 参考文献 ................................................................ 44 结束语 .................................................................. 46 致谢 .................................................................... 47 分布式下载工具的设计与开发 第一章 前言 1.1项目简单介绍 本下载工具是联合局域网内的几台客户机同时去下载Internet网上的同一资源的不同数据块,下载完后按顺序统一整合。它由下载客户机与服务器两个部分组成,其中客户机完成下载与连接其他用户的功能;而服务器则管理用户和资源情况,供客户机提供在线用户的数据,并且服务器能够对用户和资源进行控制。比如:封锁某些不合法的资源、禁止某些不合法的用户使用等。 其原理是利用局域网内高的传输速度和解决局域网被限速问题。例如:局域网的主机A要去下载Internet上某服务器的资源,那么它就会联合局域网内的几台主机(主机B,主机C,主机D等),它先请求服务器获取信息(资源大小),然后根据资源大小和联合的主机数平均分配任务,分别向服务器下载数据。在下载过程中,每台机将定时发送本机所下载的资源给主机A,直到下载完成。在下载过程中,如果主机C的平均速度与其他主机的平均下载速度相差悬殊的话,那么主机A将发出撤销主机C的请求,然后主机A重新搜索局域网内的其他主机代替主机C。若局域网内的主机都不能接受请求的话,那主机A将把主机C剩下的资源重新平均分配给正在下载的主机,这样就完成了整个下载任务,因此得到了很短的下载时间。 1.2 项目特点 1. 本系统实现了多台机的联机下载。 2. 本系统能够对机器的性能进行分析,然后调整每台机的下载量。 3. 本系统能够检测客户端机器突然死机或者关闭的情况,对其释放,然后重新寻找 新的客户端进行下载剩下的资源。 4. 本系统能够对每个资源进行管理,当有遇到一些不合法的资源时,可对其资源进 行封闭。 5. 本系统能够有效管理客户端的使用,当有客户进行一些非法资源的传播时,可对 他进行封锁。 1 1.3 项目开发背景 随着网络的发展以及各种应用软件的出现,我们可以通过网络实现与远方亲人进行电话聊天,与朋友进行互动游戏。因此相应的网络带宽也越来越受到人们的重视,人们一般通过租用更多的带宽来提高网络速度。 但是在BT软件以及电驴等P2P工具日益发展的今天,不管你有多少带宽他都会100%的占用。所以目前,如何封锁P2P软件逐渐成为局域网网络管理员头疼的问题,很多局域网都将这个问题转换为带宽限制,他们通过一些软件和路由的控制有效地限制了网络带宽,从而实现对P2P软件的控制,大大影响了P2P下载软件的下载速度,效果非常显著。但是我们总是追求更高品质的网络生活,希望下载速度能够“再快一点”。对此,我将根据这些存在的问题设计出了此系统,大大提高了下载速度。 1.4 项目的创新性 1. 本软件能够主动连接其他机器分块进行下载,从而不会出现下载重复资源的现象,而其他P2P软件则是被动的,避免不了下载重复资源。 2. 本软件能够有效达到了资源共享,充分利用了局域网内高的传输速度的特点,达到了资源的高效利用。 1.5 项目开发的总目标 系统开发的总目标是:充分利用局域网内的高速的传输速率与解决局域网内被限速带来的下载速度慢的问题来提高他们的下载速度。 2 分布式下载工具的设计与开发 第二章 需求分析 2.1 功能需求 根据校园网特点和目前的下载工具状况,我对这个系统的需求具有以下几个主要功能: 1. 单机下载因特网上的资源。 2. 连接局域网内的其他用户一起下载因特网上的资源。 3. 当遇到本局域网内有其他用户曾下载过的资源,系统能够识别它,然后直接从本 局域网下载此资源。 针对以上几个主要功能,可把本系统分为两大模块:分布式下载工具客户端和分布式下载工具服务器端。其中分布式下载工具客户端又可分为发起下载管理模块和接受下载管理模块。 2.2 性能需求 本系统是利用局域网内每台机互传的速度快的原理,并且是为了解决局域网内被限速导致下载速度慢的问题,所以本系统在一个局域网内并且该局域网内的IP被限了速度的环境下使用时,效果将会达到相当明显。 3 2.3 系统数据流图 2.3.1 系统总体数据流图 图2.1 系统总体数据流图 从图2.1系统总体数据流图可看出,客户端新建下载任务首先向服务器端发送命令,等待服务器端返回的可供联机的地址,然后客户端根据这些地址向客户端发送联机请求,等待客户端回应,最后一起参与下载。 4 分布式下载工具的设计与开发 2.3.2 服务器端数据流图 图2.2 服务器端顶层数据流图 由上图可看出,客户端发送命令到服务器端,服务器端接收命令,然后对命令的一次处理,处理完后把相应的数据存入数据库,然后再从数据库取出数据,然后把数据经过一次命令处理后把他转为命令,最后把命令发送给客户端。 5 图2.3 系统第二层数据流图 服务器端第二层数据流图如上图所示,命令在处理之后分为6种不同处理过程,系统分别对不同的处理过程来操作数据库,并把所得的结果经过命令格式化转变为命令,最后发送给客户端。 2.3.3客户端数据流图 6 分布式下载工具的设计与开发 图2.4 客户端顶层数据流图 由图2.4可看出客户端下载任务时,向服务器端发出请求,获取可供联机的用户,然后进行联机区下载。 7 图2.5 客户端第二层数据流图 由图2.5可看出,客户端与服务器,客户端与客户端之间都分别进行命令分析,对不同的命令进行相应的操作。 8 分布式下载工具的设计与开发 第三章 概要设计 3.1 系统结构设计 3.1.1 系统结构示意图 图3.1 系统结构示意图 3.1.2 系统组织模块结构图 图3.2 系统组织模块结构图 9 3.1.3 系统HIPO表 (a) 发起下载管理模块IPO表 (b) 接收下载管理模块IPO表 10 分布式下载工具的设计与开发 (C)服务器管理模块 图3.3 系统HIPO表 3.2 接口设计 3.2.1 用户界面接口 本系统以一个友好而简单的界面呈现给用户,如下图: 11 图3.4 客户端界面图 资源搜索区 资源列表区 信息显示区 用户列表区 图3.5 客户端界面图 12 分布式下载工具的设计与开发 3.2.2 软件系统接口 (1)客户端与客户端之间的通讯。采用TCP通讯协议。 发起下载客户端发送给接收下载客户端之间的命令格式: URL Startbytes Endbytes , 开始字节 结束字节 结束标志 资源的url地址 (2)客户端与服务器端之间的通讯。采用TCP通讯协议。 客户端发送给服务器端的命令格式: Status IP # 状态 客户端IP地址 其中状态包括:ON 系统启动 END 系统关闭 NEW 新建下载任务 CHANGE 改变用户。 服务器返回客户端的命令格式: IP # „/„/„ 有效的IP地址,多个IP结束标志 之间用”/”分开 3.2.3 软件内部接口 表 3.1 主要的模块接口表 接口名称 传递参数 接口说明 CHttpDowndLoad::DownLoad() 下载基本信息 下载服务器资源 CHttpDowndLoad::TestLink() url 测试能否连接服务器 CHttpDowndLoad::MTConnectThread() 用户IP地址 连接参与下载的用户 CHttpDowndLoad::MTServerThreadAccept() 无 创建监听对象 CHttpDowndLoad::SendData() 连接套接字 发送数据 3.3 数据库设计 表 3.2 UserIP 用户信息表 字段名 类型 说明 备注 UserID Int 用户ID号 主键,自动标识 13 UserIP Varchar(16) 用户IP地址 , Status Int 用户状态 -1为封锁 0为离 线,1为在线 表3.3 UserDownInfo 用户下载资源信息表 字段名 类型 说明 备注 InfoID Int 资源ID 主键,自动标识 UserIP Varchar(16) 用户IP地址 , URL Varchar 资源下载的url地址 , Path Varchar 资源存放路径 , FileName Varchar 资源存放名称 , DownTime Date 下载时间 , FinishFlag Int 完成标志 0为未完成,1为完 成 Forbid Int 封锁标志 -1为封锁,0为正 常 14 分布式下载工具的设计与开发 第四章 详细设计 4.1基本设计概念和处理流程 创建下载任务模块表示需要下载某一资源的用户所用的模块,其工作流程图: 图4.1 发起下载管理模块工作流程图 15 接收下载命令模块表示接收发起机的下载命令进行下载,其流程图如图4.2 图4.2 接收下载管理模块工作流程图 用户IP管理服务器,用来管理在线用户,提供客户机可参与下载的用户IP信息。其工作流程图如下: 16 分布式下载工具的设计与开发 图4.3 服务器端工作流程图 4.2 关键技术代码 1. 下载资源代码 UINT CHttpDowndLoad::DownLoad(LPVOID pParam) { CHttpSocket HttpSocket1; IDInfo *IdInfo; IdInfo=new IDInfo; IdInfo=(IDInfo *)pParam; const char *pRequestHeader = NULL; char *pResponseHeader=NULL; char *pAcceptType=NULL; long nLength; DWORD dwServiceType; CString strServer; CString strObject; 17 unsigned short nPort; //得到视图类的指针 // CDownLoadView* dlv; CMDIFrameWnd *pFrame = (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd; // Get the active MDI child window. CMDIChildWnd *pChild=(CMDIChildWnd *) pFrame->GetActiveFrame(); // Get the active view attached to the active MDI child window. POSITION pos=pChild->GetActiveDocument()->GetFirstViewPosition(); CDownLoadView *pView=(CDownLoadView*)pChild->GetActiveDocument()->GetNextView(pos); CFile* DownloadFile; //打开在StartHttpDownLoad()中创建的文件 DownloadFile=new CFile; DownloadFile->Open(pView->m_taskdowninfo[IdInfo->TaskID].savepath+pView->m_taskdowninfo[IdInfo->TaskID].filename,CFile::modeWrite|CFile::shareDenyNone); HttpSocket1.CloseSocket; AfxParseURL((LPCTSTR)(pView->m_taskdowninfo[IdInfo->TaskID].url),dwServiceType,strServer, strObject, nPort); pRequestHeader = HttpSocket1.FormatRequestHeader((LPTSTR)(LPCTSTR)strServer,(LPTSTR)(LPCTSTR)strObject,nLength,NULL,NULL,pView->m_taskdowninfo[IdInfo->TaskID].ThreadDownInfo[IdInfo->ThreadID].FromBytes,pView->m_taskdowninfo[IdInfo->TaskID].ThreadDownInfo[IdInfo->ThreadID].ToBytes,0,NULL); DownloadFile->Seek(pView->m_taskdowninfo[IdInfo->TaskID].ThreadDownInfo[IdInfo->ThreadID].FromBytes,CFile::begin); //设置文件指针位置*/ HttpSocket1.Socket(); HttpSocket1.Connect((LPTSTR)(LPCTSTR)strServer,nPort); HttpSocket1.SendRequest(); pResponseHeader=HttpSocket1.GetResponseCharPoint(); int nSvrState = HttpSocket1.GetServerState(); CString csState; 18 分布式下载工具的设计与开发 csState.Format("%d",nSvrState); csState=csState.Left(1); if(csState=="2") { char pData[5024]; //用于存放接收数据的字符数组 long nReceSize = 0; //实际接收数据的长度(服务器返回来的值) CString fpath; long rsize,sendsize; rsize=0; sendsize=0; long nsize; char buf1[5024]; nsize=pView->m_taskdowninfo[IdInfo->TaskID].ThreadDownInfo[IdInfo->ThreadID].ToBy tes-pView->m_taskdowninfo[IdInfo->TaskID].ThreadDownInfo[IdInfo->ThreadID].FromBy tes; while(rsizeWrite(pData,nReceSize); rsize=rsize+nReceSize; pView->m_taskdowninfo[IdInfo->TaskID].finishsize+=nReceSize; } DownloadFile->Close(); 19 pView->m_taskdowninfo[IdInfo->TaskID].ThreadDownInfo[IdInfo->ThreadID].FinishFlag=true; ::PostMessage(pView->m_hWnd,WM_SENDDATA,0,(long)&IdInfo); } return 0; } 2. 连接其他用户代码 UINT CHttpDowndLoad::MTConnectThread(LPVOID pParam) { //得到视图类的指针 // CDownLoadView* dlv; CMDIFrameWnd *pFrame = (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd; // Get the active MDI child window. CMDIChildWnd *pChild=(CMDIChildWnd *) pFrame->GetActiveFrame(); // Get the active view attached to the active MDI child window. POSITION pos=pChild->GetActiveDocument()->GetFirstViewPosition(); CDownLoadView *pView=(CDownLoadView*)pChild->GetActiveDocument()->GetNextView(pos); IDInfo *IdInfo; IdInfo=new IDInfo; IdInfo=(IDInfo*)pParam; char buf[1024]; sockaddr_in addr; addr.sin_addr.S_un.S_addr = inet_addr(pView->m_taskdowninfo[IdInfo->TaskID].UserDownInfo[IdInfo->ThreadID].Use rIP); addr.sin_family=AF_INET; addr.sin_port=LOCAL_PORT; WSADATA wsaData; WSAStartup(0x101,&wsaData); 20 分布式下载工具的设计与开发 SOCKET g_ConnectSocket; g_ConnectSocket = socket(AF_INET, SOCK_STREAM,0); if(g_ConnectSocket==INVALID_SOCKET) { return -1; } if(connect(g_ConnectSocket,(sockaddr*)&addr,sizeof(addr))==-1) { AfxMessageBox("无法连接到客户机"); return -1; } pView->m_taskdowninfo[IdInfo->TaskID].UserDownInfo[IdInfo->ThreadID].s=g_Conn ectSocket; CString temp,finishsize,fromsize; fromsize.Format("%d",pView->m_taskdowninfo[IdInfo->TaskID].UserDownInfo[IdInfo ->ThreadID].FromBytes); finishsize.Format("%d",pView->m_taskdowninfo[IdInfo->TaskID].UserDownInfo[IdInf o->ThreadID].ToBytes); temp="URL:"; temp+=pView->m_taskdowninfo[IdInfo->TaskID].url; temp+="lfromsize:"; temp+=fromsize; temp+="lfinishsize:"; temp+=finishsize; temp+="#"; strcpy(buf,temp); int slen; slen=0; int tlen; tlen=temp.GetLength(); 21 while(slen=0) { break; } else if(temp2.Find("cmd:end")>=0) { closesocket(g_ConnectSocket); ::PostMessage(pView->m_hWnd,WM_CHANGEUSR,(long)IdInfo,0); return 0; } else { CString speed2,finishsize2,time2; ParseBuf2(buf2,finishsize2,speed2,time2); pView->m_taskdowninfo[IdInfo->TaskID].UserDownInfo[IdInfo->ThreadID].Rate=finis hsize2; pView->m_taskdowninfo[IdInfo->TaskID].UserDownInfo[IdInfo->ThreadID].Speed=sp eed2; 22 分布式下载工具的设计与开发 pView->m_taskdowninfo[IdInfo->TaskID].UserDownInfo[IdInfo->ThreadID].Time=time2; } } CFile* rfile; //打开在StartHttpDownLoad()中创建的文件 rfile=new CFile; rfile->Open(pView->m_taskdowninfo[IdInfo->TaskID].savepath+pView->m_taskdowninfo[IdInfo->TaskID].filename,CFile::modeWrite|CFile::shareDenyNone); rfile->Seek(pView->m_taskdowninfo[IdInfo->TaskID].UserDownInfo[IdInfo->ThreadID].FromBytes,CFile::begin); //设置文件指针位置 long rlength,len,buflen,startsize; rlength=0; char buf1[5024]; while(rlengthm_taskdowninfo[IdInfo->TaskID].UserDownInfo[IdInfo->ThreadID].ToBytes-pView->m_taskdowninfo[IdInfo->TaskID].UserDownInfo[IdInfo->ThreadID].FromBytes) { len=recv(g_ConnectSocket,buf1,5024,0); rfile->Write(buf1,len); rlength+=len; pView->m_taskdowninfo[IdInfo->TaskID].finishsize+=pView->m_taskdowninfo[IdInfo->TaskID].finishsize; } rfile->Close; return 0; } 3. 点对点互传代码 UINT CHttpDowndLoad::SendFile(LPVOID pParam) { //得到视图类的指针 23 // CDownLoadView* dlv; CMDIFrameWnd *pFrame = (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd; // Get the active MDI child window. CMDIChildWnd *pChild=(CMDIChildWnd *) pFrame->GetActiveFrame(); // Get the active view attached to the active MDI child window. POSITION pos=pChild->GetActiveDocument()->GetFirstViewPosition(); CDownLoadView *pView=(CDownLoadView*)pChild->GetActiveDocument()->GetNextView(pos); ConnectInfo *ConInfo; ConInfo=(ConnectInfo *)pParam; long FileSize; long ReadSize; long SendSize; long TempSize; CString temp; CString SFileSize; char buf[128]; char data[5*1024]; CFile pFile; if(pFile.Open(ConInfo->Path,CFile::modeRead|CFile::shareDenyNone)) { FileSize=pFile.GetLength(); SFileSize.Format("%d",FileSize); temp="STATUS:HAVESIZE:"; temp+=SFileSize; temp+="#"; strcpy(buf,temp); send(ConInfo->s,buf,temp.GetLength(),0); ReadSize=0; SendSize=0; 24 分布式下载工具的设计与开发 while(SendSizes,data,ReadSize,0); SendSize+=ReadSize; } } else { temp="STATUS:NONESIZE:#"; strcpy(buf,temp); send(ConInfo->s,buf,temp.GetLength(),0); return 0; } return 0; } 4.服务器命令处理代码 Public Function DoEvent(ByVal str As String, ByVal ss As Socket) As Boolean Dim dv As DataView Dim userip As String Dim status As String status = str.Substring(str.IndexOf("STATUS:") + 7, str.IndexOf("IP:") - str.IndexOf("STATUS:") - 7) Select Case status Case "START" '用户启动命令 userip = str.Substring(str.IndexOf("IP:") + 3, str.IndexOf("#") - str.IndexOf("IP:") - 3) dv = db.RunSQLAsDataView("select * from UserIP where UserIP like '%" + userip + "%'") '查询用户信息是否已经在数据库 If dv.Count > 0 Then '如果用户已经存在,则直接更新用户状态为在 线 db.RunDelOrInsSQL("update UserIP set status='1' where UserIP like '%" + userip + "%'") Else '如果用户不存在,则插入用户IP并且置状态为在线 db.RunDelOrInsSQL("insert into UserIP(UserIP,status) values('" + userip + "','1')") 25 End If RefreshUserList() 'txbShowInfo控件显示用户上线信息 ShowData("用户" + userip + "上线了") Case "CLOSE" '用户离开命令 userip = str.Substring(str.IndexOf("IP:") + 3, str.IndexOf("#") - str.IndexOf("IP:") - 3) dv = db.RunSQLAsDataView("select * from UserIP where UserIP like '%" + userip + "%'") '查询用户信息是否已经在数据库 If dv.Count > 0 Then '如果用户已经存在,则直接更新用户状态 为离线 db.RunDelOrInsSQL("update UserIP set status='0' where UserIP like '%" + userip + "%'") Else '如果用户不存在,则插入用户IP并且置状态为离线 db.RunDelOrInsSQL("insert into UserIP(UserIP,status) values('" + userip + "','0')") End If RefreshUserList() 'txbShowInfo控件显示用户离线信息 ShowData("用户" + userip + "离开了") Case "CHANGE" '用户改变连接用户命令 Dim buf As String = "" userip = str.Substring(str.IndexOf("IP:") + 3, str.IndexOf("#") - str.IndexOf("IP:") - 3) dv = db.RunSQLAsDataView("select UserIP from UserIP where UserIP not like '%" + userip + "%' and status like '1'") buf = dv(0)("UserIP").ToString ss.Send(Encoding.Default.GetBytes(buf)) Case "NEW" '用户新建任务命令 Dim i As Integer Dim buf As String = "" userip = str.Substring(str.IndexOf("IP:") + 3, str.IndexOf("#") - str.IndexOf("IP:") - 3) dv = db.RunSQLAsDataView("select UserIP from UserIP where UserIP not like '%" + userip + "%' and status like '1'") buf = "/" For i = 0 To dv.Count - 1 buf += dv(i)("UserIP").ToString If i >= 10 Or i >= dv.Count - 1 Then Exit For Else 26 分布式下载工具的设计与开发 buf += "/" End If Next buf += "#" ss.Send(Encoding.Default.GetBytes(buf)) Case "DOWN" '客户下载命令 Dim url As String Dim buf As String = "STATUS:NONE#" url = str.Substring(str.IndexOf("URL:") + 4, str.IndexOf("#") - str.IndexOf("URL:") - 4) dv = db.RunSQLAsDataView("select * from UserDownInfo where Url='" + url + "'") If dv.Count > 0 Then buf = "STATUS:HAVE" buf += "IP:" + dv(0)("UserIP").ToString buf += "SAVEPATH:" + dv(0)("Path").ToString buf += "#" Else buf = "STATUS:NONEIP:#" End If ss.Send(Encoding.Default.GetBytes(buf)) Case "FINISH" '资源完成下载命令 Dim url As String Dim savepath As String Dim filename As String userip = str.Substring(str.IndexOf("IP:") + 3, str.IndexOf("URL:") - str.IndexOf("IP:") - 3) url = str.Substring(str.IndexOf("URL:") + 4, str.IndexOf("SAVEPATH:") - str.IndexOf("URL:") - 4) savepath = str.Substring(str.IndexOf("SAVEPATH") + 9, str.IndexOf("#") - str.IndexOf("SAVEPATH:") - 9) filename = savepath.Substring(savepath.LastIndexOf("\") + 1, savepath.Length - savepath.LastIndexOf("\") - 1) db.RunDelOrInsSQL("insert into UserDownInfo(UserIP,Url,Path,FileName,DownTime,FinishFlag) values('" + userip + "','" + url + "','" + savepath + "','" + filename + "','" + Now.ToString + "','0'") End Select ss.Close() db.Close() End Function 27 第五章 系统的关键技术和难点 5.1 MFC消息传递机制技术 MFC的消息是相当丰富的,它可分为两大类:系统消息和用户消息,在定义用户消息的时候需要以下几个步骤: 1,找到要处理该消息的类,进入类的头文件,在中添加消息处理函数。在这里,要注意的一点就是消息处理函数的原型。 2,在头文件中或是.cpp文件中定义用户消息。 3,然后在BEGIN_MESSAGE_MAP中指定消息映射。 4,在添加的消息函数里添加处理代码。 5,在需要发送消息的地方调用SDK中的PostMessage或SendMessage。 5.2 VC Socket通讯技术 在接受下载管理模块中用到Socket Server模式,Socket Server的步骤如下: 1.定义socket套接字。 2.初始化socket。 3.绑定监听对象。 4.创建监听。 5.接受连接。 6.接收数据。 在发送下载管理模块中用到Socket Client模式,Socket Client的步骤如下: 1.建立socket套接字。 2.初始化socket。 3.建立连接。 4.发送数据。 28 分布式下载工具的设计与开发 5.3 VC多线程技术 在 MFC 中,线程分为两种:工作线程和用户接口线程。其中用户接口线程是一种能够接收用户的输入、处理事件和消息的线程。 在VC中操作线程中,MFC 提供了两个版本的 AfxBeginThread 函数,其中一个用于创建用户接口线程。第二种分为两步进行:首先,调用线程类的构造函数创建一 CWinThread::CreateThread 函数来创建该线程。线程建立并个线程对象;其次,调用 启动后,在线程函数执行过程中一直有效。如果是线程对象,则在对象删除之前,先结束线程。 CWinThread 已经为我们完成了线程结束的工作。 最后用多线程技术还要注意一个资源共享问题,如果某一个资源给两个以上的线程同时使用的话,那就要使用线程同步技术。在 MFC 类库中对Win32的几个互斥对象进行了类封装,它们有一个共同的基类 CSyncObject ,它们的对应关系为 : Semaphore 对应 CSemaphore 、 Mutex 对应 CMutex 、 Event 对应 CEvent 、 CriticalSection 对应 CCriticalSection 。另外, MFC 对两个等待函数也进行了封装,即 CSingleLock 和 CMultiLock 。 29 第六章 软件测试与改进思想 6.1 软件测试 经过多次测试,并且采用不同的下载工具和不同的方式,得出以下测试报告表: 表6.1 多首歌曲采用不同下载工具的测试报告表 mp3条数 1首 10首 100首 工具名称 Flashget 16s 100s 30min LeoDown(普通多44s 500s 1h 线程下载工具) 分布式下载工具14s 60s 20min (两台机) 表6.2 不同大小采用不同的下载工具的测试报告表 文件大小 1MB 10MB 100MB 工具名称 Flashget 10s 80s 20min LeoDown(普通 多线程下载工35s 300s 40min 具) 分布式下载工8s 60s 15min 具(两台机) 表6.3 不同大小采用分布式下载工具不同数量机器下载的测试报告表 文件大小 1MB 10MB 100MB 工具名称 分布式下载工8s 60s 15min 具(2台) 分布式下载工7s 40s 10min 具(3台) 分布式下载工5s 30s 3min 具(10台) 30 分布式下载工具的设计与开发 6.2 软件改进思想 目前需求分析中的功能已基本实现了,并且按照预期的目标生成了一个完整实用的下载软件。但由于时间有限,本软件也难免会存在不足之处,主要是以下两方面需要改进: 1. 资源管理方面还不够完善。由于目前数据库只保存某一个资源的完成情况,没有具体到完成多少,所以对于未完全完成的资源,其他客户端是无法对他进行下载。 2. 资源下载类别上,目前只能下载http上的资源,对ftp的资源还不能下载,所以以后将会增加对ftp的解析。 31 第七章 安装与使用说明 7.1 服务器端安装说明 步骤一、点击服务器目录下的安装文件,如图7.1所示: 图7.1 安装文件图标 步骤二、点击后出现以下窗口: 图7.2 安装向导第一步 步骤三、点击下一步后,进行简单设置: 32 分布式下载工具的设计与开发 图7.3 安装向导第二步 步骤四、按下一步,完成安装: 图7.4 安装向导第三步 33 7.2 服务器端操作说明 1.启动系统,出现如图6.5所示: 图7.5 系统启动图标 2.首先连接数据库,对数据库进行设置,如图7.6所示: 图 7.6 数据库设置 3.设置成功后重启系统,打开以下界面: 34 分布式下载工具的设计与开发 图7.7 系统启动界面 4.监视客户端的动态信息,如图7.8所示: 图7.8 客户端动态信息界面 5.资源监视窗口,如图7.9所示: 35 图7.9 资源监视窗口 6.对用户进行封锁或解锁的操作: 图7.10 用户控制窗口 7.对资源进行禁止、删除、解除等操作: 36 分布式下载工具的设计与开发 图7.11 资源控制窗口 8 .对关键字进行设置,点击设置,出现以下窗口: 图 7.12 过滤关键字窗口 37 7.3 客户端的安装说明 步骤一、点击安装文件,如图7.13所示: 图7.13 客户端安装文件图标 步骤二、点击下一步,进入图7.14: 图7.14 安装向导第一步 步骤三、点击下一步,进入图7.15: 38 分布式下载工具的设计与开发 图7.15 安装向导第二步 步骤四、点击下一步,进入图7.16: 图7.16 安装向导第三步 步骤五、点击下一步,进入图7.17: 39 图7.17 安装向导第四步 步骤六、点击完成,完成安装: 图7.18 安装完成界面 40 分布式下载工具的设计与开发 7.4 客户端使用说明 1. 点击系统图标,启动系统,出现如图7.19界面: 图7.19 客户端主界面 2. 新建下载任务,点击新建按钮,出现如图7.20所示界面: 41 图7.20 新建下载任务界面 3.进入下载,如图7.21所示: 42 分布式下载工具的设计与开发 图7.21 客户端下载界面 43 参考文献 [1]张宝庄等编著. Windows界面下的网络编程. 北京: 中国科技大学出版社, 1997. [2](美)Dreamtech软件研发组著. 对等网络编程源代码解析. 北京: 电子工业出版社, 2002 . [3]刘海英等编著. Visual C++网络通信编程实用案例精选. 北京: 人民邮电出版 社, 2004 . [4](美)Harvey M.Deitel,(美)Paul J.Deitel等. Visual C++高级编程. 北京: 清华 大学出版社, 2004 . [5]银华强等编著. 精通Visual Basic.NET网络编程. 北京: 清华大学出版社, 2004 . [6]周虹等编著. C语言程序设计与应用教程. 北京: 中国铁道出版社, 2007 . [7]杨永国主编. Visual C++6.0实用教程. 北京: 清华大学出版社, 2007 10 . [8]D. Ryan Stepbens[等]著. C++ Cookbook中文版 . 北京: 清华大学出版社, 2007 . [9]施炜编著. Windows网络编程接口. 北京: 电子工业出版社, 1997.8 . [10]李婷婷编著. Visual Basic.NET项目开发实践. 北京: 中国铁道出版社, 2003 . [11]任泰明编著. TCP/IP 协议与网络编程. 西安: 西安电子科技大学出版社, 2004 . [12]熊歆斌编著. Visual C++程序设计培训教程. 北京: 清华大学出版社, 2002 . 杨永国主编. Visual C++ 6.0实用教程. 北京: 清华大学出版社, 2004 . [13] [14]傅韵编著. Visual C++ .NET编程宝典. 北京: 电子工业出版社, 2006 . [15]林涛主编. 计算机网络应用编程技术. 北京: 人民邮电出版社, 2006 . [16](美)Al Williams著; 钮文良等译. Windows 2000系统编程. 北京: 机械工业出 版社, 2001.11. [17]赵永峰编著. Visual Basic .NET编程基础与实例 . 北京: 清华大学出版 社, 2003 . [18]赵艳铎编著. Visual Basic. NET实用编程百例. 北京: 清华大学出版社, 2004 . [19](美)Jim Beveridge & Robert Wiener著. Win32多线程程序设计. 武汉: 华中科 技大学出版社, 2002.4 . [20]张宏军编著. Visual C++6.0编程案例精解. 北京: 电子工业出版社, 2005 . [21]谭锋主编著. Visual C++程序设计实训教程. 北京: 科学出版社, 2003.18. [22]辜健飞,编著. MS C/C++ 7.0程序设计. 上海: 同济大学出版社, 1995.4. 44 分布式下载工具的设计与开发 [23]夏宽理编著. C语言与程序设计. 上海: 复旦大学出版社, 1994.5 . [24](美)Jeffrey D.Schank著. 客户机/服务器结构与应用程序设计. 北京: 电子工业 出版社, 1995.2 . [25](美)Allen G. Taylor著; 吴言等译. SQL使用指南[中译文]. 北京: 电子工业出 版社, 1996.3 . [26](美)Stephen Wynkoop著; 康博创作室译. SQL Server6.5开发使用手册. 北京: 机 械工业出版社, 1998.5 . [27]袁锦华编著. Microsoft SQL Server实用指南. 广州: 中山大学出版社, 1997.6 . [28]袁鹏飞编著. SQL Server数据库应用开发技术. 北京: 人民邮电出版社, 1998.2. 45 结束语 经过了两个多月的学习和工作,我终于完成了《分布式下载工具的设计与开发》的论文。从开始接到论文题目到系统的实现,再到论文文章的完成,每走一步对我来说都是新的尝试与挑战,这也是我在大学期间独立完成的最满意的项目。在这段时间里,我学到了很多知识也有很多感受,从对下载软件的原理一无所知,对MFC等相关技术很不了解的状态,我开始了独立的学习和试验,查看相关的资料和书籍,让自己头脑中模糊的概念逐渐清晰,使自己非常稚嫩作品一步一步完善起来。每一次改进都是我学习的收获,每一次试验的成功都会让我兴奋好一段时间。从中我也充分认识到了下载工具对我们来说是多么有用的,在现在的网络世界里,资源的共享对我们来说可以节省多少空间。 虽然我的论文作品不是很成熟,还有很多不足之处,但我可以自豪的说,这里面的每一段代码,都有我的劳动。当看着自己的程序,自己成天相伴的系统能够健康的运行,真是莫大的幸福和欣慰,我相信其中的酸甜苦辣最终都会化为甜美的甘泉。 这次做毕业设计的经历也会使我终身受益,我感受到做论文是要真正用心去做的一件事情,是真正的自己学习的过程和研究的过程。没有学习就不可能有研究的能力,没有自己的研究,就不会有所突破,那也就不叫论文了。希望这次的经历能让我在以后学习中激励我继续进步。 46 分布式下载工具的设计与开发 致谢 四年的大学生活就快走入尾声,我们的校园生活就要划上句号,心中是无尽的难舍与眷恋。从这里走出,对我的人生来说,将是踏上一个新的征程,要把所学的知识应用到实际工作中去。 回首四年,取得了些许成绩,生活中有快乐也有艰辛。感谢老师们四年来对我孜孜不倦的教诲,对我成长的关心和爱护。 学友情深,情同兄妹。三年的风风雨雨,我们一同走过,充满着关爱,给我留下了值得珍藏的最美好的记忆。 在我的十几年求学历程里,离不开父母的鼓励和支持,是他们辛勤的劳作,无私的付出,为我创造良好的学习条件,我才能顺利完成学业,感激他们一直以来对我的抚养与培育。 最后,我要特别感谢江朝勇和谢赞福老师。是他们在我毕业的最后关头给了我巨大的帮助与鼓励,使我能够顺利完成毕业设计,在此表示衷心的感激~ 江老师认真负责的工作态度,严谨的治学精神和深厚的理论水平都使我受益匪浅。他无论在理论上还是在实践中,都给与我很大的帮助,使我得到不少的提高,这对于我以后的工作和学习都有一种巨大的帮助,感谢他耐心的辅导。 47
/
本文档为【下载工具开发】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索