下载工具开发-大学论文_第1页
下载工具开发-大学论文_第2页
下载工具开发-大学论文_第3页
下载工具开发-大学论文_第4页
下载工具开发-大学论文_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

下载工具的设计与开发摘要在BT软件以及电驴等P2P工具日益发展的今天,不管你有多少带宽他都会100%的占用。这类P2P软件的下载速度完全依赖带宽,然而,如何在不提高带宽的前提下提高局域网的下载速度是一个符合实际的问题,本文就基于该问题提出并实现了“分布式下载工具”系统。该系统很好的解决了局域网被限速的问题,大大提高了下载速度。“分布式下载工具”联合局域网内的几台客户机同时去下载Internet网上的同一资源的不同数据块,下载完后按顺序统一整合。它有下载客户机与服务器的功能,分别运用VC和VB.Net开发设计。客户机完成下载与连接其他用户的功能;而服务器则管理用户和资源情况,供客户机提供在线用户的数据,并且服务器能够对用户和资源进行控制。比如:封锁某些不合法的资源、禁止某些不合法的用户使用等。本系统设计完成后,并与其他下载软件进行了测试比较,提升效果明显,有一定推广使用价值。关键词:下载速度;下载软件;局域网TheDevelopmentofDistributedDownloadToolABSTRACTP2PdownloadtoolslikeBTande-Mulebecameincreasinglydevelopednowadays.Nomatterhowmuchbandwidthyouhave,100percentfullyofitwillbetheoccupied.Downloadspeedofsuchp2psoftwareistotallydependsonthebandwidth.However,howtoboostspeedofLANontheactualityofbandwidthisapracticalissue.thisarticleexpatiatesfromsuchissueandactualize“distributeddownloadtool”system.ThissystemhasaverygoodsolutiontothelimitedLAN,stronglyimprovingthedownloadspeed.The"Distributeddownloadtool”,isatechnologytojoinseveralclientsatthesametimetodownloaddifferentdatablocksfromthesomeresourcesontheInternet,andeachclientreunifiestheseblocksacompletedfile.Thesystemcanactasclientandserverboth,respectively,withVCandVB.Nettoexploitanddesign.Asaclientitdoesdownloadworkandconnectswithotherusers;whilebeingtheserver,itmanagestheusersandresourcesfortheclientandprovidesonlinedata.Besides,theservercancontrolusersandresources.Comparedwithotherdownloadsoftware,acompleted“Distributeddownloadtool”systemupgradesdownloadspeedsignificantlyandisofgoodpopularizationvalue.Keywords:DownloadSpeeds;DownloadSoftware;LocalAreaNetworks目录第一章前言 11.1项目简单介绍 11.2项目特点 11.3项目开发背景 21.4项目的创新性 21.5项目开发的总目标 2第二章需求分析 32.1功能需求 32.2性能需求 32.3系统数据流图 42.3.1系统总体数据流图 42.3.2服务器端数据流图 52.3.3客户端数据流图 6第三章概要设计 93.1系统结构设计 93.1.1系统结构示意图 93.1.2系统组织模块结构图 93.1.3系统HIPO表 103.2接口设计 113.2.1用户界面接口 113.2.2软件系统接口 133.2.3软件内部接口 133.3数据库设计 13第四章详细设计 154.1基本设计概念和处理流程 154.2关键技术代码 17第五章系统的关键技术和难点 285.1MFC消息传递机制技术 285.2VCSocket通讯技术 285.3VC多线程技术 29第六章软件测试与改进思想 306.1软件测试 306.2软件改进思想 31第七章安装与使用说明 327.1服务器端安装说明 327.2服务器端操作说明 347.3客户端的安装说明 387.4客户端使用说明 41参考文献 44结束语 46致谢 47分布式下载工具的设计与开发PAGE46PAGE47PAGE1第一章前言1.1项目简单介绍本下载工具是联合局域网内的几台客户机同时去下载Internet网上的同一资源的不同数据块,下载完后按顺序统一整合。它由下载客户机与服务器两个部分组成,其中客户机完成下载与连接其他用户的功能;而服务器则管理用户和资源情况,供客户机提供在线用户的数据,并且服务器能够对用户和资源进行控制。比如:封锁某些不合法的资源、禁止某些不合法的用户使用等。其原理是利用局域网内高的传输速度和解决局域网被限速问题。例如:局域网的主机A要去下载Internet上某服务器的资源,那么它就会联合局域网内的几台主机(主机B,主机C,主机D等),它先请求服务器获取信息(资源大小),然后根据资源大小和联合的主机数平均分配任务,分别向服务器下载数据。在下载过程中,每台机将定时发送本机所下载的资源给主机A,直到下载完成。在下载过程中,如果主机C的平均速度与其他主机的平均下载速度相差悬殊的话,那么主机A将发出撤销主机C的请求,然后主机A重新搜索局域网内的其他主机代替主机C。若局域网内的主机都不能接受请求的话,那主机A将把主机C剩下的资源重新平均分配给正在下载的主机,这样就完成了整个下载任务,因此得到了很短的下载时间。1.2项目特点1.本系统实现了多台机的联机下载。2.本系统能够对机器的性能进行分析,然后调整每台机的下载量。3.本系统能够检测客户端机器突然死机或者关闭的情况,对其释放,然后重新寻找新的客户端进行下载剩下的资源。4.本系统能够对每个资源进行管理,当有遇到一些不合法的资源时,可对其资源进行封闭。5.本系统能够有效管理客户端的使用,当有客户进行一些非法资源的传播时,可对他进行封锁。1.3项目开发背景随着网络的发展以及各种应用软件的出现,我们可以通过网络实现与远方亲人进行电话聊天,与朋友进行互动游戏。因此相应的网络带宽也越来越受到人们的重视,人们一般通过租用更多的带宽来提高网络速度。但是在BT软件以及电驴等P2P工具日益发展的今天,不管你有多少带宽他都会100%的占用。所以目前,如何封锁P2P软件逐渐成为局域网网络管理员头疼的问题,很多局域网都将这个问题转换为带宽限制,他们通过一些软件和路由的控制有效地限制了网络带宽,从而实现对P2P软件的控制,大大影响了P2P下载软件的下载速度,效果非常显著。但是我们总是追求更高品质的网络生活,希望下载速度能够“再快一点”。对此,我将根据这些存在的问题设计出了此系统,大大提高了下载速度。1.4项目的创新性1.本软件能够主动连接其他机器分块进行下载,从而不会出现下载重复资源的现象,而其他P2P软件则是被动的,避免不了下载重复资源。2.本软件能够有效达到了资源共享,充分利用了局域网内高的传输速度的特点,达到了资源的高效利用。1.5项目开发的总目标系统开发的总目标是:充分利用局域网内的高速的传输速率与解决局域网内被限速带来的下载速度慢的问题来提高他们的下载速度。第二章需求分析2.1功能需求根据校园网特点和目前的下载工具状况,我对这个系统的需求具有以下几个主要功能:单机下载因特网上的资源。连接局域网内的其他用户一起下载因特网上的资源。当遇到本局域网内有其他用户曾下载过的资源,系统能够识别它,然后直接从本局域网下载此资源。针对以上几个主要功能,可把本系统分为两大模块:分布式下载工具客户端和分布式下载工具服务器端。其中分布式下载工具客户端又可分为发起下载管理模块和接受下载管理模块。2.2性能需求本系统是利用局域网内每台机互传的速度快的原理,并且是为了解决局域网内被限速导致下载速度慢的问题,所以本系统在一个局域网内并且该局域网内的IP被限了速度的环境下使用时,效果将会达到相当明显。2.3系统数据流图2.3.1系统总体数据流图图2.1系统总体数据流图从图2.1系统总体数据流图可看出,客户端新建下载任务首先向服务器端发送命令,等待服务器端返回的可供联机的地址,然后客户端根据这些地址向客户端发送联机请求,等待客户端回应,最后一起参与下载。2.3.2服务器端数据流图图2.2服务器端顶层数据流图由上图可看出,客户端发送命令到服务器端,服务器端接收命令,然后对命令的一次处理,处理完后把相应的数据存入数据库,然后再从数据库取出数据,然后把数据经过一次命令处理后把他转为命令,最后把命令发送给客户端。图2.3系统第二层数据流图服务器端第二层数据流图如上图所示,命令在处理之后分为6种不同处理过程,系统分别对不同的处理过程来操作数据库,并把所得的结果经过命令格式化转变为命令,最后发送给客户端。2.3.3客户端数据流图图2.4客户端顶层数据流图由图2.4可看出客户端下载任务时,向服务器端发出请求,获取可供联机的用户,然后进行联机区下载。图2.5客户端第二层数据流图由图2.5可看出,客户端与服务器,客户端与客户端之间都分别进行命令分析,对不同的命令进行相应的操作。第三章概要设计3.1系统结构设计3.1.1系统结构示意图图3.1系统结构示意图3.1.2系统组织模块结构图图3.2系统组织模块结构图3.1.3系统HIPO表(a)发起下载管理模块IPO表(b)接收下载管理模块IPO表(C)服务器管理模块图3.3系统HIPO表3.2接口设计3.2.1用户界面接口本系统以一个友好而简单的界面呈现给用户,如下图:图3.4客户端界面图资源列表区用户列表区信息显示区资源搜索区资源列表区用户列表区信息显示区资源搜索区图3.5客户端界面图3.2.2软件系统接口(1)客户端与客户端之间的通讯。采用TCP通讯协议。发起下载客户端发送给接收下载客户端之间的命令格式:URLStartbytesEndbytes#结束字节开始字节资源的url地址结束标志结束字节开始字节资源的url地址结束标志(2)客户端与服务器端之间的通讯。采用TCP通讯协议。客户端发送给服务器端的命令格式:StatusIP#状态客户端IP地址状态客户端IP地址其中状态包括:ON系统启动END系统关闭NEW新建下载任务CHANGE改变用户。服务器返回客户端的命令格式:IP…/…/…#有效的IP地址,多个IP之间用”有效的IP地址,多个IP之间用”/”分开结束标志3.2.3软件内部接口表3.1主要的模块接口表接口名称传递参数接口说明CHttpDowndLoad::DownLoad()下载基本信息下载服务器资源CHttpDowndLoad::TestLink()url测试能否连接服务器CHttpDowndLoad::MTConnectThread()用户IP地址连接参与下载的用户CHttpDowndLoad::MTServerThreadAccept()无创建监听对象CHttpDowndLoad::SendData()连接套接字发送数据3.3数据库设计表3.2UserIP用户信息表字段名类型说明备注UserIDInt用户ID号主键,自动标识UserIPVarchar(16)用户IP地址-StatusInt用户状态-1为封锁0为离线,1为在线表3.3UserDownInfo用户下载资源信息表字段名类型说明备注InfoIDInt资源ID主键,自动标识UserIPVarchar(16)用户IP地址-URLVarchar资源下载的url地址-PathVarchar资源存放路径-FileNameVarchar资源存放名称-DownTimeDate下载时间-FinishFlagInt完成标志0为未完成,1为完成ForbidInt封锁标志-1为封锁,0为正常第四章详细设计4.1基本设计概念和处理流程创建下载任务模块表示需要下载某一资源的用户所用的模块,其工作流程图:图4.1发起下载管理模块工作流程图接收下载命令模块表示接收发起机的下载命令进行下载,其流程图如图4.2图4.2接收下载管理模块工作流程图用户IP管理服务器,用来管理在线用户,提供客户机可参与下载的用户IP信息。其工作流程图如下:图4.3服务器端工作流程图4.2关键技术代码1.下载资源代码UINTCHttpDowndLoad::DownLoad(LPVOIDpParam){ CHttpSocketHttpSocket1;IDInfo*IdInfo; IdInfo=newIDInfo; IdInfo=(IDInfo*)pParam;constchar*pRequestHeader=NULL; char*pResponseHeader=NULL; char*pAcceptType=NULL;longnLength; DWORDdwServiceType; CStringstrServer; CStringstrObject; unsignedshortnPort; //得到视图类的指针 // CDownLoadView*dlv; CMDIFrameWnd*pFrame=(CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;//GettheactiveMDIchildwindow.CMDIChildWnd*pChild=(CMDIChildWnd*)pFrame->GetActiveFrame();//GettheactiveviewattachedtotheactiveMDIchildwindow.POSITIONpos=pChild->GetActiveDocument()->GetFirstViewPosition(); CDownLoadView*pView=(CDownLoadView*)pChild->GetActiveDocument()->GetNextView(pos); CFile*DownloadFile;//打开在StartHttpDownLoad()中创建的文件 DownloadFile=newCFile; 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(); intnSvrState=HttpSocket1.GetServerState(); CStringcsState; csState.Format("%d",nSvrState); csState=csState.Left(1);if(csState=="2") { charpData[5024];//用于存放接收数据的字符数组 longnReceSize=0;//实际接收数据的长度(服务器返回来的值) CStringfpath; longrsize,sendsize; rsize=0;sendsize=0;longnsize; charbuf1[5024]; nsize=pView->m_taskdowninfo[IdInfo->TaskID].ThreadDownInfo[IdInfo->ThreadID].ToBytes-pView->m_taskdowninfo[IdInfo->TaskID].ThreadDownInfo[IdInfo->ThreadID].FromBytes; while(rsize<nsize) { nReceSize=HttpSocket1.Receive(pData,5024); if(nReceSize<=0) { HttpSocket1.CloseSocket();//没有可以接收的数据,关闭Socket AfxMessageBox("没有可接收的数据"); break;//returnwhile(TRUE)! } DownloadFile->Write(pData,nReceSize); rsize=rsize+nReceSize; pView->m_taskdowninfo[IdInfo->TaskID].finishsize+=nReceSize; } DownloadFile->Close(); pView->m_taskdowninfo[IdInfo->TaskID].ThreadDownInfo[IdInfo->ThreadID].FinishFlag=true; ::PostMessage(pView->m_hWnd,WM_SENDDATA,0,(long)&IdInfo); } return0;}2.连接其他用户代码UINTCHttpDowndLoad::MTConnectThread(LPVOIDpParam){ //得到视图类的指针// CDownLoadView*dlv; CMDIFrameWnd*pFrame=(CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;//GettheactiveMDIchildwindow.CMDIChildWnd*pChild=(CMDIChildWnd*)pFrame->GetActiveFrame();//GettheactiveviewattachedtotheactiveMDIchildwindow.POSITIONpos=pChild->GetActiveDocument()->GetFirstViewPosition(); CDownLoadView*pView=(CDownLoadView*)pChild->GetActiveDocument()->GetNextView(pos);IDInfo*IdInfo; IdInfo=newIDInfo; IdInfo=(IDInfo*)pParam; charbuf[1024]; sockaddr_inaddr; addr.sin_addr.S_un.S_addr=inet_addr(pView->m_taskdowninfo[IdInfo->TaskID].UserDownInfo[IdInfo->ThreadID].UserIP); addr.sin_family=AF_INET; addr.sin_port=LOCAL_PORT; WSADATAwsaData; WSAStartup(0x101,&wsaData); SOCKETg_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_ConnectSocket; CStringtemp,finishsize,fromsize; fromsize.Format("%d",pView->m_taskdowninfo[IdInfo->TaskID].UserDownInfo[IdInfo->ThreadID].FromBytes); finishsize.Format("%d",pView->m_taskdowninfo[IdInfo->TaskID].UserDownInfo[IdInfo->ThreadID].ToBytes); temp="URL:"; temp+=pView->m_taskdowninfo[IdInfo->TaskID].url; temp+="lfromsize:";temp+=fromsize;temp+="lfinishsize:"; temp+=finishsize; temp+="#"; strcpy(buf,temp); intslen; slen=0; inttlen; tlen=temp.GetLength(); while(slen<tlen) slen+=send(g_ConnectSocket,buf,tlen,0); CStringtemp2; intrlen2; charbuf2[100]; rlen2=0; while(true) {rlen2=recv(g_ConnectSocket,buf2,100,0); temp2=buf2; if(temp2.Find("cmd:recv")>=0) {break; } elseif(temp2.Find("cmd:end")>=0) { closesocket(g_ConnectSocket); ::PostMessage(pView->m_hWnd,WM_CHANGEUSR,(long)IdInfo,0); return0; } else { CStringspeed2,finishsize2,time2; ParseBuf2(buf2,finishsize2,speed2,time2); pView->m_taskdowninfo[IdInfo->TaskID].UserDownInfo[IdInfo->ThreadID].Rate=finishsize2; pView->m_taskdowninfo[IdInfo->TaskID].UserDownInfo[IdInfo->ThreadID].Speed=speed2; pView->m_taskdowninfo[IdInfo->TaskID].UserDownInfo[IdInfo->ThreadID].Time=time2; } } CFile*rfile;//打开在StartHttpDownLoad()中创建的文件 rfile=newCFile; 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);//设置文件指针位置 longrlength,len,buflen,startsize; rlength=0; charbuf1[5024]; while(rlength<pView->m_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; return0;}3.点对点互传代码UINTCHttpDowndLoad::SendFile(LPVOIDpParam){ //得到视图类的指针// CDownLoadView*dlv; CMDIFrameWnd*pFrame=(CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;//GettheactiveMDIchildwindow.CMDIChildWnd*pChild=(CMDIChildWnd*)pFrame->GetActiveFrame();//GettheactiveviewattachedtotheactiveMDIchildwindow.POSITIONpos=pChild->GetActiveDocument()->GetFirstViewPosition(); CDownLoadView*pView=(CDownLoadView*)pChild->GetActiveDocument()->GetNextView(pos); ConnectInfo*ConInfo; ConInfo=(ConnectInfo*)pParam; longFileSize; longReadSize; longSendSize; longTempSize;CStringtemp; CStringSFileSize; charbuf[128]; chardata[5*1024]; CFilepFile;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; while(SendSize<FileSize) { ReadSize=pFile.Read(data,5*1024); TempSize+=send(ConInfo->s,data,ReadSize,0); SendSize+=ReadSize; } } else { temp="STATUS:NONESIZE:#"; strcpy(buf,temp); send(ConInfo->s,buf,temp.GetLength(),0); return0; } return0;}4.服务器命令处理代码PublicFunctionDoEvent(ByValstrAsString,ByValssAsSocket)AsBooleanDimdvAsDataViewDimuseripAsStringDimstatusAsStringstatus=str.Substring(str.IndexOf("STATUS:")+7,str.IndexOf("IP:")-str.IndexOf("STATUS:")-7)SelectCasestatusCase"START"'用户启动命令userip=str.Substring(str.IndexOf("IP:")+3,str.IndexOf("#")-str.IndexOf("IP:")-3)dv=db.RunSQLAsDataView("select*fromUserIPwhereUserIPlike'%"+userip+"%'")'查询用户信息是否已经在数据库Ifdv.Count>0Then'如果用户已经存在,则直接更新用户状态为在线db.RunDelOrInsSQL("updateUserIPsetstatus='1'whereUserIPlike'%"+userip+"%'")Else'如果用户不存在,则插入用户IP并且置状态为在线db.RunDelOrInsSQL("insertintoUserIP(UserIP,status)values('"+userip+"','1')")EndIfRefreshUserList()'txbShowInfo控件显示用户上线信息ShowData("用户"+userip+"上线了")Case"CLOSE"'用户离开命令userip=str.Substring(str.IndexOf("IP:")+3,str.IndexOf("#")-str.IndexOf("IP:")-3)dv=db.RunSQLAsDataView("select*fromUserIPwhereUserIPlike'%"+userip+"%'")'查询用户信息是否已经在数据库Ifdv.Count>0Then'如果用户已经存在,则直接更新用户状态为离线db.RunDelOrInsSQL("updateUserIPsetstatus='0'whereUserIPlike'%"+userip+"%'")Else'如果用户不存在,则插入用户IP并且置状态为离线db.RunDelOrInsSQL("insertintoUserIP(UserIP,status)values('"+userip+"','0')")EndIfRefreshUserList()'txbShowInfo控件显示用户离线信息ShowData("用户"+userip+"离开了")Case"CHANGE"'用户改变连接用户命令DimbufAsString=""userip=str.Substring(str.IndexOf("IP:")+3,str.IndexOf("#")-str.IndexOf("IP:")-3)dv=db.RunSQLAsDataView("selectUserIPfromUserIPwhereUserIPnotlike'%"+userip+"%'andstatuslike'1'")buf=dv(0)("UserIP").ToStringss.Send(Encoding.Default.GetBytes(buf))Case"NEW"'用户新建任务命令DimiAsIntegerDimbufAsString=""userip=str.Substring(str.IndexOf("IP:")+3,str.IndexOf("#")-str.IndexOf("IP:")-3)dv=db.RunSQLAsDataView("selectUserIPfromUserIPwhereUserIPnotlike'%"+userip+"%'andstatuslike'1'")buf="/"Fori=0Todv.Count-1buf+=dv(i)("UserIP").ToStringIfi>=10Ori>=dv.Count-1ThenExitForElsebuf+="/"EndIfNextbuf+="#"ss.Send(Encoding.Default.GetBytes(buf))Case"DOWN"'客户下载命令DimurlAsStringDimbufAsString="STATUS:NONE#"url=str.Substring(str.IndexOf("URL:")+4,str.IndexOf("#")-str.IndexOf("URL:")-4)dv=db.RunSQLAsDataView("select*fromUserDownInfowhereUrl='"+url+"'")Ifdv.Count>0Thenbuf="STATUS:HAVE"buf+="IP:"+dv(0)("UserIP").ToStringbuf+="SAVEPATH:"+dv(0)("Path").ToStringbuf+="#"Elsebuf="STATUS:NONEIP:#"EndIfss.Send(Encoding.Default.GetBytes(buf))Case"FINISH"'资源完成下载命令DimurlAsStringDimsavepathAsStringDimfilenameAsStringuserip=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("insertintoUserDownInfo(UserIP,Url,Path,FileName,DownTime,FinishFlag)values('"+userip+"','"+url+"','"+savepath+"','"+filename+"','"+Now.ToString+"','0'")EndSelectss.Close()db.Close()EndFunction第五章系统的关键技术和难点5.1MFC消息传递机制技术MFC的消息是相当丰富的,它可分为两大类:系统消息和用户消息,在定义用户消息的时候需要以下几个步骤:1,找到要处理该消息的类,进入类的头文件,在中添加消息处理函数。在这里,要注意的一点就是消息处理函数的原型。2,在头文件中或是.cpp文件中定义用户消息。3,然后在BEGIN_MESSAGE_MAP中指定消息映射。4,在添加的消息函数里添加处理代码。5,在需要发送消息的地方调用SDK中的PostMessage或SendMessage。5.2VCSocket通讯技术在接受下载管理模块中用到SocketServer模式,SocketServer的步骤如下:1.定义socket套接字。2.初始化socket。3.绑定监听对象。4.创建监听。5.接受连接。6.接收数据。在发送下载管理模块中用到SocketClient模式,SocketClient的步骤如下:1.建立socket套接字。2.初始化socket。3.建立连接。4.发送数据。5.3VC多线程技术在MFC中,线程分为两种:工作线程和用户接口线程。其中用户接口线程是一种能够接收用户的输入、处理事件和消息的线程。在VC中操作线程中,MFC提供了两个版本的AfxBeginThread函数,其中一个用于创建用户接口线程。第二种方法分为两步进行:首先,调用线程类的构造函数创建一个线程对象;其次,调用CWinThread::CreateThread函数来创建该线程。线程建立并启动后,在线程函数执行过程中一直有效。如果是线程对象,则在对象删除之前,先结束线程。CWinThread已经为我们完成了线程结束的工作。最后用多线程技术还要注意一个资源共享问题,如果某一个资源给两个以上的线程同时使用的话,那就要使用线程同步技术。在MFC类库中对Win32的几个互斥对象进行了类封装,它们有一个共同的基类CSyncObject,它们的对应关系为:Semaphore对应CSemaphore、Mutex对应CMutex、Event对应CEvent、CriticalSection对应CCriticalSection。另外,MFC对两个等待函数也进行了封装,即CSingleLock和CMultiLock。第六章软件测试与改进思想6.1软件测试经过多次测试,并且采用不同的下载工具和不同的方式,得出以下测试报告表:表6.1多首歌曲采用不同下载工具的测试报告表mp3条数工具名称1首10首100首Flashget16s100s30minLeoDown(普通多线程下载工具)44s500s1h分布式下载工具(两台机)14s60s20min表6.2不同大小采用不同的下载工具的测试报告表文件大小工具名称1MB10MB100MBFlashget10s80s20minLeoDown(普通多线程下载工具)35s300s40min分布式下载工具(两台机)8s60s15min表6.3不同大小采用分布式下载工具不同数量机器下载的测试报告表文件大小工具名称1MB10MB100MB分布式下载工具(2台)8s60s15min分布式下载工具(3台)7s40s10min分布式下载工具(10台)5s30s3min6.2软件改进思想目前需求分析中要求的功能已基本实现了,并且按照预期的目标生成了一个完整实用的下载软件。但由于时间有限,本软件也难免会存在不足之处,主要是以下两方面需要改进:1.资源管理方面还不够完善。由于目前数据库只保存某一个资源的完成情况,没有具体到完成多少,所以对于未完全完成的资源,其他客户端是无法对他进行下载。2.资源下载类别上,目前只能下载http上的资源,对ftp的资源还不能下载,所以以后将会增加对ftp的解析。第七章安装与使用说明7.1服务器端安装说明步骤一、点击服务器目录下的安装文件,如图7.1所示: 图7.1安装文件图标步骤二、点击后出现以下窗口:图7.2安装向导第一步步骤三、点击下一步后,进行简单设置:图7.3安装向导第二步步骤四、按下一步,完成安装:图7.4安装向导第三步7.2服务器端操作说明1.启动系统,出现如图6.5所示:图7.5系统启动图标2.首先连接数据库,对数据库进行设置,如图7.6所示:图7.6数据库设置3.设置成功后重启系统,打开以下界面:图7.7系统启动界面4.监视客户端的动态信息,如图7.8所示:图7.8客户端动态信息界面5.资源监视窗口,如图7.9所示:图7.9资源监视窗口6.对用户进行封锁或解锁的操作:图7.10用户控制窗口7.对资源进行禁止、删除、解除等操作:图7.11资源控制窗口8.对关键字进行设置,点击设置,出现以下窗口:图7.12过滤关键字窗口7.3客户端的安装说明步骤一、点击安装文件,如图7.13所示:图7.13客户端安装文件图标步骤二、点击下一步,进入图7.14:图7.14安装向导第一步步骤三、点击下一步,进入图7.15:图7.15安装向导第二步步骤四、点击下一步,进入图7.16:图7.16安装向导第三步步骤五、点击下一步,进入图7.17:图7.17安装向导第四步步骤六、点击完成,完成安装:图7.18安装完成界面7.4客户端使用说明1.点击系统图标,启动系统,出现如图7.19界面:图7.19客户端主界面2.新建下载任务,点击新建按钮,出现如图7.20所示界面:图7.20新建下载任务界面3.进入下载,如图7.21所示:图7.21客户端下载界面参考文献[1]张宝庄等编著.Windows界面下的网络编程.北京:

中国科技大学出版社,

1997.[2](美)Dreamtech软件研发组著.对等网络编程源代码解析.

北京:

电子工业出版社,

2002.[3]刘海英等编著.VisualC++网络通信编程实用案例精选.北京:

人民邮电出版社,

2004.[4](美)HarveyM.Deitel,(美)PaulJ.Deitel等.VisualC++高级编程.

北京:

清华大学出版社,

2004.[5]银华强等编著.精通VisualBasic.NET网络编程.

北京:

清华大学出版社,

2004.[6]周虹等编著.C语言程序设计与应用教程.

北京:

中国铁道出版社,

2007.[7]杨永国主编.VisualC++6.0实用教程.

北京:

清华大学出版社,

200710.[8]D.RyanStepbens[等]著.C++Cookbook中文版

.

北京:

清华大学出版社,

2007.[9]施炜编著.Windows网络编程接口.

北京:

电子工业出版社,

1997.8.[10]李婷婷编著.VisualBasic.NET项目开发实践.

北京:

中国铁道出版社,

2003.[11]任泰明编著.TCP/IP协议与网络编程.西安:

西安电子科技大学出版社,

2004.[12]熊歆斌编著.VisualC++程序设计培训教程.

北京:

清华大学出版社,

2002.[13]杨永国主编.VisualC++6.0实用教程.

北京:

清华大学出版社,

2004.[14]傅韵编著.VisualC++.NET编程宝典.北京:

HYPERLINK"48

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论