快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

下载澳门新葡亰官网App:用Java设计下载软件



“收集蚂蚁”、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.p下载澳门新葡亰官网Apprintln(“Referer:”);

outStream.println();

....

注:第4行给出URL中的主机名和端口号,第5行阐明客户端接管所有MIME类型,第7行方送一个空缺行,注解哀求行停止。

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”这样的字下载澳门新葡亰官网App符串,注解欲下载文件存在、但该办事器不支持断点续传,只可以应用单线程下载。

.....

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-Len下载澳门新葡亰官网Appgth: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 ”);

outS下载澳门新葡亰官网Apptream.println(“Host:”+host);

outStream.println(“Accept:*/* ”);

outStream.println(“RANGE:bytes=”+(fileblockl下载澳门新葡亰官网Appength)*thisthreadid+“-”);

outStream.println();

.....

第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);

......

}

......

您可能还会对下面的文章感兴趣: