Java网络编程笔记2

如果要实现多线程下载,可以定义以下步骤:

1)创建URL对象(URL代表统一资源定位器)

URL url=new URL(path);//path资源路径

2)获取URL对象指向资源的大小,使用URLConnection类,该类代表应用程序和URL之间的通信链接。

HttpURLConnection conn=(HttpURLConnection) url.openConnection();

conn.setRequestMethod("GET");//以GET方式获取

conn.setRequestProperty("Accept-Language", "zh-CN");

conn.setRequestProperty("Charset", "UTF-8");

conn.setRequestProperty("Connection", "Keep-Alive");

fileSize=conn.getContentLength();//得到文件大小

conn.disconnect();

3)在本地磁盘上创建一个与网络资源相同大小的空文件

RandomAccessFile files=new RandomAccessFile(targetFile, "rw");

files.setLength(fileSize);//设置文件大小

files.close();//关闭文件

4)创建线程,计算每个线程下载资源的大小并启动线程

代码如下:

import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;

public class DownUtil {
	private String path;//下载地址
	private String targetFile;//文件保存位置
	private int threadNumber;//下载的线程数
	private int fileSize;//文件总大小
	private DownThread[] downThreads;//下载线程对象

	public DownUtil(String path,String targetFile,int threadNumber){
		this.path=path;
		this.targetFile=targetFile;
		this.threadNumber=threadNumber;
		downThreads=new DownThread[threadNumber];//初始化数组
	}
	public void download() throws Exception{
		URL url=new URL(path);
		HttpURLConnection conn=(HttpURLConnection) url.openConnection();
		conn.setRequestMethod("GET");
		conn.setRequestProperty("Accept-Language", "zh-CN");
		conn.setRequestProperty("Charset", "UTF-8");
		conn.setRequestProperty("Connection", "Keep-Alive");
		fileSize=conn.getContentLength();//得到文件大小
		conn.disconnect();
		int currentPartSize=fileSize/threadNumber+1;//每线程对象下载文件的大小
		RandomAccessFile files=new RandomAccessFile(targetFile, "rw");
		files.setLength(fileSize);//设置文件大小
		files.close();//关闭文件
		for(int i=0;i<threadNumber;i++){
			int start=i+currentPartSize;//每个线程下载的起始位置
			RandomAccessFile file=new RandomAccessFile(targetFile, "rw");
			file.seek(start);//定位下载位置

			downThreads[i]=new DownThread(path,start,currentPartSize,file);
			downThreads[i].start();//启动线程
		}

	}

}
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;

public class DownThread extends Thread{
	private int start;//下载线程起始位置
	private int currentPartSize;//该线程下载文件的大小
	private RandomAccessFile file;//存放的文件
	private String path;//下载地址
	private int length;//该线程已经下载的文件大小

	public DownThread(String path,int start,int currentPartSize,RandomAccessFile file){
		this.start=start;
		this.currentPartSize=currentPartSize;
		this.file=file;
		this.path=path;
	}
	@Override
	public void run() {
		URL url;
		try {
			url = new URL(path);
			HttpURLConnection conn=(HttpURLConnection) url.openConnection();
			conn.setRequestMethod("GET");
			conn.setRequestProperty("Accept-Language", "zh-CN");
			conn.setRequestProperty("Charset", "UTF-8");
			conn.setRequestProperty("Connection", "Keep-Alive");
			InputStream in=conn.getInputStream();
			in.skip(start);//跳过start个字节,每个线程只负责下载自己的文件
			byte[] buffer=new byte[1024];
			int hasRead=0;
			while(length<currentPartSize&&(hasRead=in.read(buffer))!=-1){
				file.write(buffer, 0, hasRead);
				length+=hasRead;
			}
			file.close();
			in.close();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
}

转载请注明出处:http://blog.csdn.net/hai_qing_xu_kong/article/details/40783867     情绪控_

时间: 2024-10-07 08:19:34

Java网络编程笔记2的相关文章

Java网络编程笔记5

在Java网络编程笔记4中我们看到了客户端与服务器通信的过程,只是在前面的程序只是单个客户端与服务器通信 的例子. 接下来我们看如何实现多个客户端与服务器通信,对于服务器来说,它要为每个客户端请求的Socket建立一个线程,并通过它进行通信. 在这里创建一个线程类用来管理Socket: <span style="font-size:18px;">public class ServerThread extends Thread { private Socket socket;

Java网络编程笔记4

Socket和ServerSocket,网络编程可以分为创建Socket.打开连接Socket的输入流和输出流,对Socket进行编程,关闭Socket. 创建Socket 一个功能齐全的Socket的工作过程包含以下四个步骤: 1.创建Socket. 2.打开连接到Socket的输入/输出流. 3.按照一定的协议对Socket进行读/写操作. 4.关闭Socket 在java.net包中,定义了Socket和ServerSocket两个类,类Socket表示客户端或者服务器Socket连接的两

java网络编程笔记

1:网络编程(理解) (1)网络编程:用Java语言实现计算机间数据的信息传递和资源共享 (2)网络编程模型 (3)网络编程的三要素 A:IP地址 a:点分十进制 b:IP地址的组成 c:IP地址的分类 d:dos命令 e:InetAddress B:端口 是应用程序的标识.范围:0-65535.其中0-1024不建议使用. C:协议 UDP:数据打包,有限制,不连接,效率高,不可靠 TCP:建立数据通道,无限制,效率低,可靠 (3)Socket机制 A:通信两端都应该有Socket对象 B:所

Java网络编程笔记1

网络编程的基础知识 什么叫计算机网络,就是把分布在不同地理区域的计算机与专门的外部设备通信线路互连成一个规模大.功能强的网络系统. 计算机网络主要能做些以下功能: 1)资源共享 2)信息传输与集中处理 3)均衡负荷与分布处理 4)综合信息服务 计算机网络按照规模大小和延伸范围来分: 1)局域网(LAN) 2)城域网(MAN) 3)广域网(WAN) 计算机网络按照网络的拓扑结构来划分: 1)星型网络 2)总线型网络 3)环线网络 4)树型网络 5)星型环线网络 ... 计算机网络按照网络的传输介质

Java网络编程笔记3

如何使用POST请求和GET请求向Web站点发送请求,参考以下代码: import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; import java.net.URLConnection; public class GetTest { private String url; private String param; /** *

Java网络编程笔记6

在前几遍文章中,我们已经知道了客户端与服务器通信,包括多个客户端与服务器的通信,接下来我们演示下客户端与服务器的完整通信过程. 先看效果图 客户端1 客户端2 服务器端 服务器线程类: <span style="font-size:18px;">public class Connection extends Thread { private JTextArea txt; private Socket st; private String msg = null; privat

java网络编程框架

虽然写过一些网络编程方面的东西,但还没有深入研究过这方面的内容,直接摘录一些文章,后续整理 原文地址:http://blog.csdn.net/lwuit/article/details/7306139 自从JDK1.4中有了NIO以后,这个方面越来越活跃,也为java赢得更多开发者的支持.做java网络编程需要掌握一些基本的知识和技能:套接字编程.阻塞/非阻塞通信.创建HTTP服务器与客户程序.数据报通信.对象的序列化与反序列化.Java反射机制.RMI框架.JDBC API.JavaMail

java网络编程socket\server\TCP笔记(转)

java网络编程socket\server\TCP笔记(转) 2012-12-14 08:30:04|  分类: Socket |  标签:java  |举报|字号 订阅 1 TCP的开销 a  连接协商三次握手,c->syn->s,s->syn ack->c, c->ack->s b  关闭协商四次握手,c->fin->s, s->ack-c,s->fin->c,c->ack->s c  保持数据有序,响应确认等计算开销 d

Java学习笔记—第十二章 Java网络编程入门

第十二章  Java网络编程入门 Java提供的三大类网络功能: (1)URL和URLConnection:三大类中最高级的一种,通过URL网络资源表达方式,可以很容易确定网络上数据的位置.利用URL的表示和建立,Java程序可以直接读入网络上所放的数据,或把自己的数据传送到网络的另一端. (2)Socket:又称"套接字",用于描述IP地址和端口(在Internet中,网络中的每台主机都有一个唯一的IP地址,而每台主机又通过提供多个不同端口来提供多种服务).在客户/服务器网络中,当客