快速业务通道

用java多线程断点续传实践 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22
r 服务器遇到了意料不到的情况,不能完成客 户的请求。

g) 503 Service Unavailable 服务器由于维护或者负载过重未能应答。例如 ,Servlet可能在数据库连接池已满的情况下返回503。

在这些状态里面,只有200与206才是我们需要的正确的状态。所以在代码⑥ 处,进行了状态码的判断,如果返回不符合要求的状态码,则结束线程,返回主 线程并提示报错。

用java多线程断点续传实践(4)

时间:2010-12-22 BlogJava bitmap

假设一切正常,下面我们就要考虑从网络中读数据了。正如我之前在分析 mysql的数据库驱动中看的一样,网络中发送数据都是以数据包的形式来发送的 ,也就是说不管是客户端向服务器发出的请求数据,还是从服务器返回给客户端 的响应数据,都会被拆分成若干个小型数据包在网络中传递,等数据包到达了目 的地,网络接口会依据数据包的编号来组装它们,成为完整的比特数据。因此, 我们可以想到在这里也是一样的,我们用inputStream的read方法来通过网卡从 网络中读取数据,并不一定一次就能把所有的数据包都读完,所以我们要不断的 循环来从inputStream中读取数据。Read方法有一个int型的返回值,表示每次从 inputStream中读取的字节数,如果把这个inputStream中的数据读完了,那么就 返回-1。

Read方法最多可以有三个参数,byte b[]是读取数据之后存放的目标数组, off标识了目标数组中存储的开始位置,len是想要读取的数据长度,这个长度必 定不能大于b[]的长度。

public synchronized int read(byte b[], int off, int  len);

我们的目标是要把目标地址的内容下载下来,现在分了5个线程来分段下载, 那么这些分段下载的数据保存在哪里呢?如果把它们都保存在内存中是非常糟糕 的做法,如果文件相当之大,例如是一个视频的话,难道把这么大的数据都放在 内存中吗,这样的话,万一连接中断,那前面下载的东西就都没有了?我们当然 要想办法及时的把下载的数据刷到磁盘上保存下来。当用bt下载视频的时候,通 常都会有个临时文件,当视频完全下载结束之后,这个临时文件就会被删除,那 么下次继续下载的时候,就会接着上次下载的点继续下载。所以我们的 outputStream就是往这个临时文件来输出了。

OutputStream的write方法和上面InputStream的read方法有类似的参数, byte b[]是输出数据的来源,off标识了开始位置,len是数据长度。

public synchronized void write(byte b[], int off, int len)  throws IOException;

在往临时文件的outputStream中写数据的时候,我会加上一个计数器,每满 5000个比特就往文件中flush一下(代码⑦处)。

对于输出流的flush,有些要注意的地方,在程序中有三个地方调用了 outputStream.flush()。第一个是在循环的读取网络数据并往 outputStream中 写入的时候,每满5000个byte就flush一下(代码⑦处);第二个是循环之后( 代码⑧处),这时候正常的读取写入操作已经完成,但是outputStream中还有没 有刷入磁盘的数据,所以要flush一下才能关闭连接;第三个就是在异常中的 flush(代码⑨处),因为如果发生了连接超时或者读取数据超时的话,就会直 接跑到catch的exception中去,这个时候outputStream中的数据如果不 flush的 话,重新连接的时候这部分数据就会丢失了。另外,当抛出异常,重新连接的时 候,下载的起始位置也要重新设置(代码④处),count就是用来标识已经下载 的字节数的,把count+startPosition就是新一次连接需要的下载起始位置了。

3、现在每个分段的下载线程都顺利结束了,也都创建了相应的临时文件,接 下来在主线程中会对临时文件进行合并,并写入目标文件,最后删除临时文件。 这部分很简单,就是一个对所有下载线程进行遍历的过程

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号