Java技术体验:HTTP多线程下载,端口侦听和自启动服务 - 编程入门网
作者 佚名技术
来源 NET编程
浏览
发布时间 2012-06-19
程数 * @param referer 来源 */ public HTTPDownloader(String page, String referer, String savePath, int threadNumber) { this.page = page; this.savePath = savePath; this.threadNumber = threadNumber; this.referer = referer; } public String getPage() { return page; } public void setPage(String page) { this.page = page; } public String getSavePath() { return savePath; } public void setSavePath(String savePath) { this.savePath = savePath; } public int getThreadNumber() { return threadNumber; } public void setThreadNumber(int threadNumber) { this.threadNumber = threadNumber; } public String getReferer() { return referer; } public void setReferer(String referer) { this.referer = referer; } } /** * 下载线程 * * @author 赵学庆 www.java2000.net */ class HTTPDownloaderThread extends Thread { HTTPDownloader manager; int startPos; int endPos; int id; int curPos; int BUFFER_SIZE = 4096; int readByte = 0; HTTPDownloaderThread(HTTPDownloader manager, int id, int startPos, int endPos) { this.id = id; this.manager = manager; this.startPos = startPos; this.endPos = endPos; } public void run() { // System.out.println("线程" + id + "启动"); // 创建一个buff BufferedInputStream bis = null; RandomAccessFile fos = null; // 缓冲区大小 byte[] buf = new byte[BUFFER_SIZE]; URLConnection con = null; try { File file = new File(manager.getSavePath()); // 创建RandomAccessFile fos = new RandomAccessFile(file, "rw"); // 从startPos开始 fos.seek(startPos); // 创建连接,这里会为每个线程都创建一个连接 URL url = new URL(manager.getPage()); con = url.openConnection(); con.setAllowUserInteraction(true); curPos = startPos; // 设置获取资源数据的范围,从startPos到endPos con.setRequestProperty("Range", "bytes=" + startPos + "-" + endPos); // 盗链解决 con.setRequestProperty("referer", manager.getReferer() == null ? manager.getPage() : manager.getReferer()); con.setRequestProperty("userAgent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"); // 下面一段向根据文件写入数据,curPos为当前写入的未知,这里会判断是否小于endPos, // 如果超过endPos就代表该线程已经执行完毕 bis = new BufferedInputStream(con.getInputStream()); while (curPos < endPos) { int len = bis.read(buf, 0, BUFFER_SIZE); if (len == -1) { break; } fos.write(buf, 0, len); curPos = curPos + len; if (curPos > endPos) { // 获取正确读取的字节数 readByte += len - (curPos - endPos) + 1; } else { readByte += len; } } // System.out.println("线程" + id + "已经下载完毕:&quo |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |
你可能对下面的文章感兴趣
关于Java技术体验:HTTP多线程下载,端口侦听和自启动服务 - 编程入门网的所有评论