java实现多线程、断点下载

发表于2年前(Jun 8, 2015 11:58:42 AM)  阅读 376  评论 0

分类: Java 类库工具

标签: 多线程下载 断点下载 Content-Disposition RANGE Content-Range

1、知识预备

平时我们用下载工具用的很多,下载工具具有多线程下载,断点续传等优点。多线程下载简单来说就是向服务器发起多个连接,一般来说服务器会给当前连接的每个客户端平均分配带宽,如果你的连接多,自然而然的速度就比别人快。不过现在很多服务器都有安全机制,一般会限制每个ip的连接数,碰到这种情况的话,就要靠代理ip来解决了。

使用多线程下载主要是发起连接时,向服务器说明此次连接需要获取的数据段,通过URLConnection类的setRequestProperty("RANGE","bytes=0-23245")来设定,如果服务器支持的话,在response的header里面将会带入Content-Range属性,里面标示了这次返回的字节范围。

断点续传的话就比较简单,无非记录本次下载的进度,下次连接时,还是通过制定数据字节范围,继续未完成的下载。麻烦的地方主要在于如何记录进度,记录的频率,还有异常的情况发生,这里异常的情况指的是,用户强行结束进程,电脑宕机断电等情况,如何在这些情况发

......

java解析华为网盘真实下载地址

发表于2年前(Jun 3, 2015 4:22:35 PM)  阅读 336  评论 0

分类: Java 类库工具

标签: 华为网盘 外链 解析下载地址

1、背景:

这几年涌现出一大批网盘运营商,对于很多服务器磁盘有限的站长也经常将要提供下载的文件上传到网盘,以节省自己的空间。一般来说,都是链接到网盘页面,然后用户点击下载开始下载文件,其中不乏有些网盘需要登录,需要提取码等等,这些操作能不能简化,一次性过呢?是可以的,笔者写的这个java类是针对华为网盘,通过网盘的链接地址,获取到该页面下载列表里面的所有文件的真实下载地址。获得真实下载地址后,其实直接可以使用该地址作为图片、音乐等等的外链了。不过最后测试的时候,笔者发现,华为网盘的下载地址是有时效性的,过一段时间后必须重新加密计算,做外链的话多了一次解析加密的过程。

2、原理:

华为网盘的真实下载地址主要由两个字段计算出来,一个是encryKey,一个是downloadurl,downloadurl是一大长串字符,每个文件唯一对应,而encryKey不是固定的,每个下载页面对应一个encryKey(时效性就跟这个值有关),同一个下载页面的所有文件encryKey相同。

加密所需要的两个字段都在下载页面

......

一个简单的缓存框架MemCache

发表于3年前(Dec 24, 2014 2:29:11 PM)  阅读 904  评论 0

分类: Java 类库工具 MemCache

标签: memcache 缓存框架 自动刷新

1、背景介绍:

缓存框架笔者用得不多,主要是传统行业对使用缓存的概念很薄弱,不像互联网行业那么强烈。笔者曾经用过Ehcache,Memcached,就只有这两个了,而且基本都用得很少。具笔者有限的了解,这里就不百度了,有兴趣的读者自己百度,这两个框架共同点:都支持分布式部署,都支持缓存失效,都能控制缓存大小。不同点:Ehcache支持持久化到硬盘,而Memcached就不行,只能使用内存,Ehcache集群之间数据会保持一致,挂了一台,不影响数据的丢失,而Memcached数据是分成几份存在不同集群机器上,挂了一台,那台机器上的数据就丢失了,所以互联网企业用redis比较多,能弥补Memcached的不足。Memcached主要是更轻量级,笔者上次使用Memcached是用来作为Session服务器。

缓存是一个很简单的东西,初级程序员往往会觉得很高大上,其实很多人都在实际中应用过。举个很简单的例子,项目中经常有些静态常量,我们会写个工具类来引用,其实这也可以算作缓存,缓存的作用就是将经常访问且很少改变的数据保存在内存中(或硬盘一切读取很快

......

多线程任务调度工具类

发表于3年前(Dec 24, 2014 2:22:19 PM)  阅读 722  评论 0

分类: Java 类库工具 MultiThreadJob

标签: 多线程任务调度

笔者不知道是不是已经有很多这种开源的成熟的多线程任务调度的工具,笔者也是最近才开始实践多线程编程,这个工具类也算这段学习的一点心得吧。再来说下这个工具类的作用,举个例子,网站抓图,抓图的代码很多,也很简单,网上一搜一大把,但是那些都是单线程的,使用多线程来抓图是不是会更快呢,这个当然。我们把每张图片当成一个job,每个job都是执行同一个操作,下载图片,不同的只是图片地址以及保存的文件名。在这里我们已经抽象出来了一个job,笔者最初的设想就是,我只要实现这个job,然后创建一堆job往一个任务线程池(暂时我们这么称呼它)里放,然后这些job就自动被调度执行了,听起来还不错吧。