当前位置:天才代写 > tutorial > JAVA 教程 > 用Java设计下载软件

用Java设计下载软件

2017-11-10 08:00 星期五 所属: JAVA 教程 浏览:933

副标题#e#

“网络蚂蚁”、Falshget 等很多多线程下载软件都是网友的必备东西,操作这些东西可以快速从处事器上下载较量大的文件,这些东西的事情特性是把处事器端的文件分成几个段,每个段别离、同时举办下载。编写这类措施,第一、必需对HTTP协议有较为充实的相识;第二、有效利用多线程编程手段在软件上实现。

HTTP 协议的简介

HTTP协议是一种超文本传输协议(Hypertext Transfer Protocol),事情于网络应用层,自1990年起遍及应用于WWW 的全球信息处事,HTTP协议的具体说明可以在网上查阅RFC2518、RFC2616等文档。

HTTP 协议老的尺度是HTTP/1.0,今朝最通用的尺度是HTTP/1.1。HTTP/1.1是在HTTP/1.0基本上的进级,增加了一些成果,全面兼容HTTP/1.0。HTTP/1.0不支持文件断点续传,假如处事器利用HTTP/1.0,“网络蚂蚁”的任何多线程下载措施都只能按单线程下载;亏得今朝的Web处事器绝大大都都回收了HTTP/1.1,所以,下面将基于HTTP/1.1举办先容。

HTTP协议的相关重要呼吁

基于HTTP的欣赏器欣赏网页、下载文件时,事情道理雷同客户机/处事器模式:欣赏器向Web处事器发出一个HTTP请求行;Web处事器在收到有效的请求后,返回一个状态行或多个响应标题、一个空缺行和相关文档。按照这一事情道理,下载措施必需实现向处事器发送请求和获取处事器响应状态的成果。

1.向处事器发送 GET请求呼吁

一个HTTP请求由一个请求行、可选数目标请求标题、一个空缺行,以及在POST环境下的一些特另外数据构成。请求行的名目是:

请求要领 URI  HTTP/版本号

GET 呼吁是欣赏器常用的文档请求要领,在措施中间利用

GET URI  HTTP/1.1

向Web处事器发送请求行(行号3),Java 代码如下:

....
clientSocket = new Socket(host, port);//打开要下载文件处事器的Socket
outStream = new PrintStream(clientSocket.getOutputStream());
....
outStream.println(“GET”+uri+“ HTTP/1.1”);
outStream.println(“Host:”+host);
outStream.println(“Accept:*/* ”);
outStream.println(“Referer:”);
outStream.println();
....

注:第4行给出URL中的主机名和端标语,第5行说明客户端吸收所有MIME范例,第7行方送一个空缺行,表白请求行竣事。


#p#副标题#e#

2.获取处事器响应状态

在发送HTTP请求行今后,措施就可以读取处事器的响应状态了。HTTP响应状态行包罗:HTTP 状态码和一些HTTP响应标题。

1) HTTP状态码

HTTP状态码名目是 HTTP/版本信息的数字暗示。状态码例子如下:

HTTP/1.0 200 OK // 暗示处事器支持HTTP/1.0 协议,乐成

HTTP/1.1 200 OK // 暗示处事器支持HTTP/1.1 协议,乐成

HTTP/1.0 404 Not Found // 暗示处事器支持HTTP/1.0 协议,会见文件没有找到

在措施中间,假如读到“HTTP/1.1 200 OK”这样的字符串,表白欲下载文件存在、该处事器支持断点续传,可以利用多线程下载。假如读到“HTTP/1.0 200 OK”这样的字符串,表白欲下载文件存在、但该处事器不支持断点续传,只可以利用单线程下载。

.....
while ((line=inStream.readLine()) != null) //将处事器响应状态读到line
........
if(line.substring(0,7).equals(“HTTP/1.”) ) //判定是否支持HTTP/1.1
{ if(line.charAt(7)==‘0’)
{
System.out.println(“server use http/1.0”);
threadcount=1;
}
if(!(line.substring(9,12)).equals(“200”)) //判定请求是否乐成
{ System.out.println(“ERROR:”+line);
return false;
}
}

2) 读取重要的响应标题,得到要下载文档的文件长度

假如HTTP状态码表白会见乐成,处事器会回送一些标题行,我们最存眷的是Content-Length 这一行,好比,假如处事器回送“Content-Length:1000”,表白请求文件的长度是1000字节,所以读取这一行信息,可以获得文件的长度信息:

....
if(line.substring(0,15).equals(“Content-Length:”) )
{ filelength=Long.parseLong(line.substring(15).trim());
System.out.println(“file length:” +filelength);
}
......

向处事器发送断点续传请求

如上所述,假如处事器支持HTTP/1.1,再次向处事器发送GET请求:

.....
outStream.println(“GET ”+uri+“HTTP/1.1 ”);
outStream.println(“Host:”+host);
outStream.println(“Accept:*/* ”);
outStream.println(“RANGE:bytes=”+(fileblocklength)*thisthreadid+“-”);
outStream.println();
.....

#p#分页标题#e#

第4行是要害,“RANGE:bytes=”是HTTP/1.1新增内容,HTTP/1.0每次传送文件都是从文件头开始,即0字节处开始,“RANGE:bytes=XXXX”暗示要求处事器从文件XXXX字节处开始传送,这就是我们平时所说的断点续传!

支解文件,多线程下载

利用多线程编程技能,同时启动多个线程,按照线程个数,计较文件支解位置,向处事器发送几个差异的下载断点,同时接管数据并写入文件,就可以实现多线程下载了。

.....
raf=new RandomAccessFile(file,“rw”);//以随机存取方法打开文件
.....
synchronized(raf) //按同步方法把各个线程获得数据别离写入文件
{ raf.seek(thisthreadid*(filelength/threadcount)+k*buflength);
raf.write(readbytes);
......
}
......

 

    关键字:

天才代写-代写联系方式