您的位置:首页 > 理论基础 > 计算机网络

Java网络编程1

2009-11-29 21:11 330 查看
InetAddress类代表IP地址,有两个子类,Inet4Address,Inet6Address代表IPV4和IPv6,没有构造方法,但是提供个了两个静态方法来获取InetAddress实例:getByName(String host):根据逐句获取对应的InetAddress对象;getByAddress(byte[]addr):根据原始IP地址来获取对应的InetAddress对象.

String getCanonicalHostName():获取此IP地址的全限定域名

String getHostAddress():返回该InetAddress实例对应的IP地址字符串

String getHostName():获取此IP地址的主机名

Boolean isReachable():测试是否可以到达该地址

URLDecoder 和URLEncoder用于普通字符串和application/x-www-form-urlencoded MIME字符串之间的相互转换。

URLDecoder的decode(String s,String enc)静态方法,他可以将看上去乱码的特殊字符转换成普通字符串

URLEncoder的encode(String s,String enc)静态方法,他可以将普通字符串转换成application/x-www-form-urlencoded MIME字符串

URL和URLConnection

URL url=new URL("http://doc.mysql.cn/download/chm/refman-5.1.mysql.tar.gz");

URLConnection conn=url.openConnection();

一个下载资源的线程程序

import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
public class DownThread extends Thread {
// 定义字节数组的长度
private final static int BUFFER_LEN = 32;
// 定义下载的起点
private long start;
// 定义下载的结束点
private long end;
// 定义下载资源对应的输入流
private InputStream is;
// 将下载的字节输出
private RandomAccessFile raf;
public DownThread(long start, long end, InputStream is,
RandomAccessFile raf) {
super();
//输出该线程负责下载的字节位置
System.out.println(start+"---->"+end);
this.start = start;
this.end = end;
this.is = is;
this.raf = raf;
}
public void run(){
try {
is.skip(start);
raf.seek(start);
//定义读取输入流内容的缓存数组
byte []buff=new byte[BUFFER_LEN];
//本线程负责下载的资源大小
long contentLen=end-start;
//定义最多需要读取几次就可以完成资源下载
long times=contentLen/BUFFER_LEN+4;
//实际读取的字节数
int hasRead;
for(int i=0;i<times;i++){
hasRead=is.read(buff);
if(hasRead<0){
break;
}
raf.write(buff,0,hasRead);
}
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
if(is!=null){
is.close();
}
if(raf!=null){
raf.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}


多线程下载一个文件

import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
public class MutilDown {
/**
* @param args
*/
public static void main(String[] args) {
final int DOWN_THREAD_NUM = 4;
final String OUT_FILE_NAME = "mysql.tar.gz";
InputStream [] isArr=new InputStream[DOWN_THREAD_NUM];
RandomAccessFile []outArr=new RandomAccessFile[DOWN_THREAD_NUM];

try {
//创建一个URL对象
URL url=new URL("http://doc.mysql.cn/download/chm/refman-5.1.mysql.tar.gz");
//以此打开一个InputStream
isArr[0]=url.openStream();
long fileLen=getFileLength(url);
//以输出文件名创建一个RandomAccessFile输出流
outArr[0]=new RandomAccessFile(OUT_FILE_NAME,"rw");
//创建一个与下载文件同样大小的空文件
for(int i=0;i<fileLen;i++){
outArr[0].write(0);
}
//每个线程应该下载的字节数
long numPerThread=fileLen/DOWN_THREAD_NUM;
//整个下载资源整除后剩余的字节数
long left=fileLen%DOWN_THREAD_NUM;
for(int i=0;i<DOWN_THREAD_NUM;i++){
//每个线程打开一个线程,一个RandomAccessFile对象
//让每个线程分别负责下载资源不同的部分
if(i!=0){
//以URL打开多个输入流
isArr[i]=url.openStream();
//以指定输出文件创建多个RandomAccessFile对象
outArr[i]=new RandomAccessFile(OUT_FILE_NAME,"rw");
}
//分别启动线程下载
if(i==DOWN_THREAD_NUM-1){
//负责下载剩余的字节
new DownThread(i*numPerThread,(i+1)*numPerThread+left,isArr[i],outArr[i]).start();
}else{
//每个线程下载一定的字节数
new DownThread(i*numPerThread,(i+1)*numPerThread,isArr[i],outArr[i]).start();
}
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch(IOException ioe){
ioe.printStackTrace();
}
}
private static long getFileLength(URL url) throws IOException {
long length=0;
//打开该URL对应的URLConnection
URLConnection con=url.openConnection();
//获取连接URL资源长度
long size =con.getContentLength();
length=size;
return length;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: