-0-学习目录一.Internet下载流程............................................................1二.下载管理器概述.................................................................2三.Download、DownloadsTableModel、ProgressRenderer、DownloadManager四个类的代码清单及功能说明..................31、Download.java................................................................-3-2、DownloadManager.java..................................................-7-3、DownloadsTableModel.java........................................-13-4、ProgressRenderer.java..............................................-15-四.编译并运行下载管理器...................................................18五.实训体会................................-17-一.Internet下载流程其工作过程可分为四步:-1-首先客户机与服务器需要建立连接。只要单击某个超级链接,HTTP的工作就开始了。建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接。工作流程图如果在以上过程中的某一步出现错误,那么产生错误的信息将返回到客户端,由显示屏输出。对于用户来说,这些过程是由HTTP自己完成的,用户只要用鼠标点击,等待信息显示就可以了。许多HTTP通讯是由一个用户代理初始化的并且包括一个申请在源服务器上资源的请求。最简单的情况可能是在用户代理和服务器之间通过一个单独的连接来完成。在Internet上,HTTP通讯通常发生在TCP/IP连接之上。缺省端口是TCP80,但其它的端口也是可用的。但这并不预示着HTTP协议在Internet或其它网络的其它协议之上才能完成。HTTP只预示着一个可靠的传输。在中,“客户”与“服务器”是一个相对的概念,只存在于一个特定的连接期间,即在某个连接中的客户在另一个连接中可能作为服务器。基于HTTP协议的客户/服务器模式的信息交换过程,它分四个过程:建立连接、发送请求信息、发送响应信息、关闭连接。这就好像上面的例子,我们电话订货的全过程。其实简单说就是任何服务器除了包括HTML文件以外,还有一个HTTP驻留程序,用于响应用户请求。你的浏览器是HTTP客户,向服务器发送请求,当浏览器中输入了一个开始文件或点击了一个超级链接时,浏览器就向服务器发送了HTTP请求,此请求被送往由IP地址指定的URL。驻留程序接收到请求,在进行必要的操作后回送所要求的文件。在这一过程中,在网络上发送和接收的数据已经被分成一个或多个数据包(packet),每个数据包包括:要传送的数据;控制信息,即告诉网络怎样处理数据包。TCP/IP决定了每个数据包的格式。如果事先不告诉你,你可能不会知道信息被分成用于传输和再重新组合起来的许多小块。-2-HTTP/1.0这是第一个在通讯中指定版本号的HTTP协议版本,至今仍被广泛采用,特别是在代理服务器中。HTTP/1.1当前版本。持久连接被默认采用,并能很好地配合代理服务器工作。还支持以管道方式在同时发送多个请求和断点继传,这是ftp不法实现的。以便降低线路负载,提高传输速度。二.下载管理器概Downkoad下载管理器它可以暂停下载并恢复,还可以同时实现多个下载,此外它还可以从下载的中断点恢复下载。此下载器不仅实现了文件下载功能,它还可以进行功能扩充,只要增加一些类和方法就可以实现。Download的主要工作由Download类[完成。它的主要作用是下载一个文件并将其内容保存到磁盘,每次向Download添加一个新的下载任务时,就会有一个新的Download对象被实例化,已处理这个下载。Download具有同时下载多个文件的能力。为此,每个进行的下载任务都必须独立进行,且每个单独的下载还管理自己的状态,以便反映在GUI中。Download类首先声明几个静态的final变量,用来指定类中将使用的几个变量,变量URL用来保存被下载文件的URL,变量size用来指定下载文件的字节数大小,变量Download用来保存已经下载的字节数主要功能按钮介绍文本域:用于输入你要下载的文件的URL地址。addDownioad:此按钮被点击时GUI会注册一个监听对象。url:用于显示当前正在下载的任务的网络地址。size:用于显示下载对象的文件大小。progress:用于显示下载完成的百分比。status:用于显示当前的下载状态。pause:暂停当前的下载任务。resume:继续当前的下载任务。cancel:取消当前的下载任务。clear:将当前的下载任务从列表中删除。GUI管理当前的下载列表。列表中的每个下载都会报告它的URL,文件大小(字节形式),完成的百分比进度及当前状态。根据功能组件的会划分,Downkoad可以分为几个类,DownkoadManager类负责GUI。DownkoadTableModel和ProgressRenderer类显示当前的下载列表。Downkoad负责执行文件的实际下载操作。-3-三.Download、DownloadsTableModel、ProgressRenderer、DownloadManager四个类的代码清单及功能说明Download类负责执行文件下载操作,它主要作用是下载一个文件并将其保存到磁盘。DownloadsTableMode类主要用于容纳下载列表,并且是GUI实例的后台数据源。ProgressRenderer类是一个小的工具类,用于显示列与GUI下载列表的下载的当前速度。Download类负责创建并运行GUI实例,同时利用DownloadsTableMode和ProgressRenderer,以显示当前的下载列表。四个类的代码如下1、Download.javaimportjava.io.*;importjava.net.*;importjava.util.*;//这个类用于从一个URL地址下载文件classDownloadextendsObservableimplementsRunnable{//下载缓冲区最大大小privatestaticfinalintMAX_BUFFER_SIZE=1024;//这些是状态名称publicstaticfinalStringSTATUSES[]={Downloading,Paused,Complete,Cancelled,Error};//这些是状态代码publicstaticfinalintDOWNLOADING=0;publicstaticfinalintPAUSED=1;publicstaticfinalintCOMPLETE=2;publicstaticfinalintCANCELLED=3;publicstaticfinalintERROR=4;privateURLurl;//下载地址privateintsize;//文件大小(字节)privateintdownloaded;//已下载大小(字节)privateintstatus;//当前下载状态//构造下载函数.publicDownload(URLurl){this.url=url;size=-1;downloaded=0;status=DOWNLOADING;//开始下载-4-download();}//获取这个下载的地址publicStringgetUrl(){returnurl.toString();}//获取该下载的文件大小publicintgetSize(){returnsize;}//获取该下载的下载进度publicfloatgetProgress(){return((float)downloaded/size)*100;}//获取该下载的下载状态publicintgetStatus(){returnstatus;}//暂停下载publicvoidpause(){status=PAUSED;stateChanged();}//恢复下载publicvoidresume(){status=DOWNLOADING;stateChanged();download();}//取消下载publicvoidcancel(){status=CANCELLED;stateChanged();}//标记该下载,因为下载出错privatevoiderror(){status=ERROR;stateChanged();}//开始或恢复下载privatevoiddownload(){Threadthread=newThread(this);thread.start();-5-}//从URL地址中获取文件名privateStringgetFileName(URLurl){StringfileName=url.getFile();returnfileName.substring(fileName.lastIndexOf('/')+1);}//下载文件publicvoidrun(){RandomAccessFilefile=null;InputStreamstream=null;try{//连接URLHttpURLConnectionconnection=(HttpURLConnection)url.openConnection();//指定下载文件的开始位置(应该是断点续传的意思)connection.setRequestProperty(Range,bytes=+downloaded+-);//连接connection.connect();//确定回应代码在200以内if(connection.getResponseCode()/100!=2){error();}//检查有效的内容长度intcontentLength=connection.getContentLength();if(contentLength1){error();}//设置下载的大小如果尚未设置if(size==-1){size=contentLength;stateChanged();}//打开文件并查找文件尾file=newRandomAccessFile(getFileName(url),rw);file.seek(downloaded);stream=connection.getInputStream();while(status==DOWNLOADING){//缓冲区大小根据剩余文件大小调整bytebuffer[];if(size-downloadedMAX_BUFFER_SIZE){buffer=newbyte[MAX_BUFFER_SIZE];}else{buffer=newbyte[size-downloaded];-6-}//从服务器读取并存入缓冲区intread=stream.read(buffer);if(read==-1)break;//从缓冲区读取并写入文件file.write(buffer,