java实训报告.docx
《java实训报告.docx》由会员分享,可在线阅读,更多相关《java实训报告.docx(29页珍藏版)》请在冰点文库上搜索。
java实训报告
目录
一.Internet下载流程1
二.下载管理器概述2
三.Download、DownloadsTableModel、ProgressRenderer、DownloadManager四个类的代码清单及功能说明3
1、Download.java-4-
2、DownloadManager.java-8-
3、DownloadsTableModel.java-15-
4、ProgressRenderer.java-17-
四.编译并运行下载管理器18
五.实训体会-19-
一.Internet下载流程
其工作过程可分为四步:
首先客户机与服务器需要建立连接。
只要单击某个超级链接,HTTP的工作就开始了。
建立连接后,客户机发送一个请求给服务器,请求方式的格式为:
统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。
服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。
客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接。
工作流程图
如果在以上过程中的某一步出现错误,那么产生错误的信息将返回到客户端,由显示屏输出。
对于用户来说,这些过程是由HTTP自己完成的,用户只要用鼠标点击,等待信息显示就可以了。
许多HTTP通讯是由一个用户代理初始化的并且包括一个申请在源服务器上资源的请求。
最简单的情况可能是在用户代理和服务器之间通过一个单独的连接来完成。
在Internet上,HTTP通讯通常发生在TCP/IP连接之上。
缺省端口是TCP80,但其它的端口也是可用的。
但这并不预示着HTTP协议在Internet或其它网络的其它协议之上才能完成。
HTTP只预示着一个可靠的传输。
在WWW中,“客户”与“服务器”是一个相对的概念,只存在于一个特定的连接期间,即在某个连接中的客户在另一个连接中可能作为服务器。
基于HTTP协议的客户/服务器模式的信息交换过程,它分四个过程:
建立连接、发送请求信息、发送响应信息、关闭连接。
这就好像上面的例子,我们电话订货的全过程。
其实简单说就是任何服务器除了包括HTML文件以外,还有一个HTTP驻留程序,用于响应用户请求。
你的浏览器是HTTP客户,向服务器发送请求,当浏览器中输入了一个开始文件或点击了一个超级链接时,浏览器就向服务器发送了HTTP请求,此请求被送往由IP地址指定的URL。
驻留程序接收到请求,在进行必要的操作后回送所要求的文件。
在这一过程中,在网络上发送和接收的数据已经被分成一个或多个数据包(packet),每个数据包包括:
要传送的数据;控制信息,即告诉网络怎样处理数据包。
TCP/IP决定了每个数据包的格式。
如果事先不告诉你,你可能不会知道信息被分成用于传输和再重新组合起来的许多小块。
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负责执行文件的实际下载操作。
三.Download、DownloadsTableModel、ProgressRenderer、DownloadManager四个类的代码清单及功能说明
Download类负责执行文件下载操作,它主要作用是下载一个文件并将其保存到磁盘。
DownloadsTableMode类主要用于容纳下载列表,并且是GUI实例的后台数据源。
ProgressRenderer类是一个小的工具类,用于显示列与GUI下载列表的下载的当前速度。
Download类负责创建并运行GUI实例,同时利用DownloadsTableMode和ProgressRenderer,以显示当前的下载列表。
四个类的代码如下
1、Download.java
importjava.io.*;
import.*;
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;
//开始下载
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();
}
//从URL地址中获取文件名
privateStringgetFileName(URLurl){
StringfileName=url.getFile();
returnfileName.substring(fileName.lastIndexOf('/')+1);
}
//下载文件
publicvoidrun(){
RandomAccessFilefile=null;
InputStreamstream=null;
try{
//连接URL
HttpURLConnectionconnection=
(HttpURLConnection)url.openConnection();
//指定下载文件的开始位置(应该是断点续传的意思)
connection.setRequestProperty("Range",
"bytes="+downloaded+"-");
//连接
connection.connect();
//确定回应代码在200以内
if(connection.getResponseCode()/100!
=2){
error();
}
//检查有效的内容长度
intcontentLength=connection.getContentLength();
if(contentLength<1){
error();
}
//设置下载的大小如果尚未设置
if(size==-1){
size=contentLength;
stateChanged();
}
//打开文件并查找文件尾
file=newRandomAccessFile(getFileName(url),"rw");
file.seek(downloaded);
stream=connection.getInputStream();
while(status==DOWNLOADING){
//缓冲区大小根据剩余文件大小调整
bytebuffer[];
if(size-downloaded>MAX_BUFFER_SIZE){
buffer=newbyte[MAX_BUFFER_SIZE];
}else{
buffer=newbyte[size-downloaded];
}
//从服务器读取并存入缓冲区
intread=stream.read(buffer);
if(read==-1)
break;
//从缓冲区读取并写入文件
file.write(buffer,0,read);
downloaded+=read;
stateChanged();
}
//如果文件下载完成,改变下载状态为complete
if(status==DOWNLOADING){
status=COMPLETE;
stateChanged();
}
}catch(Exceptione){
error();
}finally{
//关闭文件
if(file!
=null){
try{
file.close();
}catch(Exceptione){}
}
//关闭与服务器的连接
if(stream!
=null){
try{
stream.close();
}catch(Exceptione){}
}
}
}
//提醒使用者下载状态已经改变
privatevoidstateChanged(){
setChanged();
notifyObservers();
}
}
}
2、DownloadManager.java
importjava.awt.*;//引入所以的包
importjava.awt.event.*;//引入所以事件包
import.*;//引入网络
importjava.util.*;//引入所需的使用的包
importjavax.swing.*;//引入swing文件夹
importjavax.swing.event.*;//引入swing文件夹下的事件包
//下载管理
publicclassDownloadManagerextendsJFrame//定义下载管理类继承窗口
implementsObserver//实现观察者
{
//下载文本域
privateJTextFieldaddTextField;//定义文本域增加域
//下载表数据模型
privateDownloadsTableModeltableModel;//定义下载表格模型
//下载表格列表
privateJTabletable;//定义表格
//这些按钮为管理选定的下载
privateJButtonpauseButton,resumeButton;//定义按钮
privateJButtoncancelButton,clearButton;//定义按钮
//当前选择的下载
privateDownloadselectedDownload;//定义选择下载
//表的选择标记是否被清除
privatebooleanclearing;//定义类型
//构造函数可下载管理
publicDownloadManager()//定义下载管理
{
//设置应用主题
setTitle("DownloadManager");//主题名称
//设置窗口尺寸
setSize(640,480);//窗口大小
//处理窗口关闭事件
addWindowListener(newWindowAdapter()//增加窗口监听器
{
publicvoidwindowClosing(WindowEvente)//定义空窗口
{
actionExit();//操作出口
}
});
//建立文件菜单
JMenuBarmenuBar=newJMenuBar();//定义菜单栏
JMenufileMenu=newJMenu("File");//定义文件菜单
fileMenu.setMnemonic(KeyEvent.VK_F);//建立文件菜单
JMenuItemfileExitMenuItem=newJMenuItem("Exit",
KeyEvent.VK_X);//菜单文件出口
fileExitMenuItem.addActionListener(newActionListener()//增加退出窗口
{
publicvoidactionPerformed(ActionEvente)//定义空菜单出口
{
actionExit();//操作出口
}
});
fileMenu.add(fileExitMenuItem);//文件菜单
menuBar.add(fileMenu);//在文件才单中增加菜单条
setJMenuBar(menuBar);//建立菜单条
//建立增加面板
JPaneladdPanel=newJPanel();//定义面板
addTextField=newJTextField(30);//增加文本文件
addPanel.add(addTextField);//增加面板
JButtonaddButton=newJButton("AddDownload");//面板名称
addButton.addActionListener(newActionListener()//增加操作监听器
{
publicvoidactionPerformed(ActionEvente)//定义所做的操作空间,
{
actionAdd();//增加操作
}
});
addPanel.add(addButton);//增加面板
//建立下载表
tableModel=newDownloadsTableModel();//定义表格模型
table=newJTable(tableModel);//定义表格
table.getSelectionModel().addListSelectionListener(new
ListSelectionListener()//建立表格
{
publicvoidvalueChanged(ListSelectionEvente)//定义值的变化
{
tableSelectionChanged();//表格选择变化
}
});
//只允许一排在同一时间来挑选
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);//建立表格模型
//建立进度条为描绘器为进度的专栏
ProgressRendererrenderer=newProgressRenderer(0,100);//定义进度描绘器
renderer.setStringPainted(true);//显示文本进度
table.setDefaultRenderer(JProgressBar.class,renderer);//表格建立默认进度
//设定的表的行高足够大适合进度条
table.setRowHeight(
(int)renderer.getPreferredSize().getHeight());//定义表格行高
//建立下载面板
JPaneldownloadsPanel=newJPanel();//定义下载面板
downloadsPanel.setBorder(
BorderFactory.createTitledBorder("Downloads"));//下载面板,建立边框
downloadsPanel.setLayout(newBorderLayout());//下载面板,建立布局
downloadsPanel.add(newJScrollPane(table),//创建滚动窗口
BorderLayout.CENTER);//边框布局
//设置按钮面板
JPanelbuttonsPanel=newJPanel();//定义按钮面板
pauseButton=newJButton("Pause");//显示暂停按钮
pauseButton.addActionListener(newActionListener()//暂停按钮,增加监听器
{
publicvoidactionPerformed(ActionEvente)//定义按钮单击方法
{
actionPause();//操作暂停
}
});
pauseButton.setEnabled(false);//暂停按钮,建立启用
buttonsPanel.add(pauseButton);//按钮控制面板,增加暂停按钮
resumeButton=newJButton("Resume");//定义重新开始按钮
resumeButton.addActionListener(newActionListener()//重新开始按钮,增加监听器
{
publicvoidactionPerformed(ActionEvente)//定义监听器
{
actionResume();//重新开始操作
}
});
resumeButton.setEnabled(false);//重新开始按钮,建立启用
buttonsPanel.add(resumeButton);//按钮控制面板,增加重新开始按钮
cancelButton=newJButton("Cancel");//定义取消按钮
cancelButton.addActionListener(newActionListener()//取消按钮,增加监听器
{
publicvoidactionPerformed(ActionEvente)//定义监听器
{
actionCancel();//重新取消操作
}
});
cancelButton.setEnabled(false);//取消按钮,建立启动
buttonsPanel.add(cancelButton);//按钮控制板,增加取消按钮
clearButton=newJButton("Clear");//定义清除按钮
clearButton.addActionListener(newActionListener()//清除按钮,增加监听器
{
publicvoidactionPerformed(ActionEvente)//定义监听器
{
actionClear();//清除操作
}
}
);
clearButton.setEnabled(false);//清除按钮,建立启动
buttonsPanel.add(clearButton);//按钮控制板,增加清除