java断点续传 http_http断点续传简单实现(java)

[月影读书频道 http://wf66.com/]

fileSplitterFetch.splitterStop();

}

}

//负责部分文件的抓取

**FileSplitterFetch.java

*/

package NetFox;

import java.io.*;

import java.net.*;

public class FileSplitterFetch extends Thread {

String sURL; //File URL

long nStartPos; //File Snippet Start Position

long nEndPos; //File Snippet End Position

int nThreadID; //Thread's ID

boolean bDownOver = false; //Downing is over

boolean bStop = false; //Stop identical

FileAccessI fileAccessI = null; //File Access interface

public FileSplitterFetch(String sURL,String sName,long nStart,long nEnd,int id) throws IOException

{

this.sURL = sURL;

this.nStartPos = nStart;

this.nEndPos = nEnd;

nThreadID = id;

fileAccessI = new FileAccessI(sName,nStartPos);//定位

}

public void run()

{

while(nStartPos < nEndPos && !bStop)

{

try{

URL url = new URL(sURL);

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

httpConnection.setRequestProperty("User-Agent","NetFox");

String sProperty = "bytes="+nStartPos+"-";

httpConnection.setRequestProperty("RANGE",sProperty);

Utility.log(sProperty);

InputStream input = httpConnection.getInputStream();

//logResponseHead(httpConnection);

byte[] b = new byte[1024];

int nRead;

while((nRead=input.read(b,0,1024)) > 0 && nStartPos < nEndPos && !bStop)

{

nStartPos += fileAccessI.write(b,0,nRead);

//if(nThreadID == 1)

// Utility.log("nStartPos = " + nStartPos + ", nEndPos = " + nEndPos);

}

Utility.log("Thread " + nThreadID + " is over!");

bDownOver = true;

//nPos = fileAccessI.write (b,0,nRead);

}

catch(Exception e){e.printStackTrace ();}

}

}

//打印回应的头信息

public void logResponseHead(HttpURLConnection con)

{

for(int i=1;;i++)

{

String header=con.getHeaderFieldKey(i);

if(header!=null)

//responseHeaders.put(header,httpConnection.getHeaderField(header));

Utility.log(header+" : "+con.getHeaderField(header));

else

break;

}

}

public void splitterStop()

{

bStop = true;

}

}

/*

**FileAccess.java

*//文件访问(定位,写)

package NetFox;

import java.io.*;

public class FileAccessI implements Serializable{//RandomAccessFile类用于在任意一个文件的特定位置上读/写字节

RandomAccessFile oSavedFile;

long nPos;

public FileAccessI() throws IOException

{

this("",0);

}

public FileAccessI(String sName,long nPos) throws IOException

{

oSavedFile = new RandomAccessFile(sName,"rw");

this.nPos = nPos;

oSavedFile.seek(nPos);

}

public synchronized int write(byte[] b,int nStart,int nLen)

{

int n = -1;

try{

oSavedFile.write(b,nStart,nLen);

n = nLen;

}

catch(IOException e)

{

e.printStackTrace ();

}

return n;

}

}

/*

**SiteInfoBean.java

*/

package NetFox;

public class SiteInfoBean {

private String sSiteURL; //Site's URL

private String sFilePath; //Saved File's Path

private String sFileName; //Saved File's Name

private int nSplitter; //Count of Splited Downloading File

public SiteInfoBean()

{//nSplitter的缺省值为5

//default value of nSplitter is 5

this("","","",5);

}

public SiteInfoBean(String sURL,String sPath,String sName,int nSpiltter)

{

sSiteURL= sURL;

sFilePath = sPath;

sFileName = sName;

this.nSplitter = nSpiltter;

}

public String getSSiteURL()

{

return sSiteURL;

}

public void setSSiteURL(String value)

{

sSiteURL = value;

}

public String getSFilePath()

{

return sFilePath;

}

public void setSFilePath(String value)

{

sFilePath = value;

}

public String getSFileName()

{

return sFileName;

}

public void setSFileName(String value)

{

sFileName = value;

}

public int getNSplitter()

{

return nSplitter;

}

public void setNSplitter(int nCount)

{

nSplitter = nCount;

}

}

/*

**Utility.java

*/

package NetFox;

public class Utility {

public Utility()

{

}//线程睡眠

public static void sleep(int nSecond)

{

try{

Thread.sleep(nSecond);

}

catch(Exception e)

{

e.printStackTrace ();

}

}//日志

public static void log(String sMsg)

{

System.err.println(sMsg);

}

public static void log(int sMsg)

{

System.err.println(sMsg);

}

}

/*

**TestMethod.java

*/

package NetFox;

public class TestMethod {

public TestMethod()

{ ///xx/weblogic60b2_win.exe

try{

SiteInfoBean bean = new SiteInfoBean("http://localhost/xx/weblogic60b2_win.exe","L:\temp","weblogic60b2_win.exe",5);

//SiteInfoBean bean = new SiteInfoBean("http://localhost:8080/down.zip","L:\temp","weblogic60b2_win.exe",5);

SiteFileFetch fileFetch = new SiteFileFetch(bean);

fileFetch.start();

}

catch(Exception e){e.printStackTrace ();}

}

public static void main(String[] args)

{

new TestMethod();

}

}

对该文的评论 :

主要就是206响应和Content-Range罢了 sjjf。

trace:

我写过用socket实现的http断点下载的程序,其实写起来不难,关键是你要看懂蚂蚁里面的日志和RFC中的http协议

---------------------------------------Powered by DvNews.net

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值