자바 단점 속전 의 원리 실현

사실 정지점 속전 의 원 리 는 매우 간단 하 다. 바로 Http 의 요청 에 있어 서 일반적인 다운로드 와 다 를 뿐이다.  예 를 들 어 브 라 우 저가 서버 에 있 는 글 을 요청 할 때 보 내 는 요청 은 다음 과 같 습 니 다.  서버 도 메 인 이름 이 wwww. sjtu. edu. cn 이 고 파일 이름 은 down. zip 이 라 고 가정 합 니 다.  GET /down.zip HTTP/1.1  Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-  excel, application/msword, application/vnd.ms-powerpoint, */*  Accept-Language: zh-cn  Accept-Encoding: gzip, deflate  User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)  Connection: Keep-Alive
서버 가 요청 을 받 은 후 요청 한 파일 을 찾 아 파일 의 정 보 를 추출 한 후 브 라 우 저 에 게 돌아 가 다음 과 같은 정 보 를 되 돌려 줍 니 다.
200  Content-Length=106786028  Accept-Ranges=bytes  Date=Mon, 30 Apr 2001 12:56:11 GMT  ETag=W/"02ca57e173c11:95b"  Content-Type=application/octet-stream  Server=Microsoft-IIS/5.0  Last-Modified=Mon, 30 Apr 2001 12:56:11 GMT
정지점 전송 이란 파일 이 다운 로드 된 곳 부터 계속 다운로드 해 야 한 다 는 것 이다.그래서 클 라 이언 트 브 라 우 저가 웹 서버 에 전 달 될 때 메 시 지 를 하나 더 추가 해 야 합 니 다. 어디서부터 시작 해 야 합 니까?  다음은 웹 서버 에 요청 정 보 를 전달 하기 위해 자신 이 만 든 '브 라 우 저' 로 20000 바이트 부터 시작 해 야 합 니 다.  GET /down.zip HTTP/1.0  User-Agent: NetFox  RANGE: bytes=2000070-  Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
자세히 보면 한 줄 더 생 겼 어 요. RANGE: bytes = 200070 -  이 줄 은 서버 다운. zip 에 이 파일 이 200070 바이트 부터 전송 되 고 앞 에 있 는 바이트 가 전송 되 지 않 아 도 된다 는 뜻 입 니 다.  서버 가 이 요청 을 받 은 후 돌아 오 는 정 보 는 다음 과 같 습 니 다.  206  Content-Length=106786028  Content-Range=bytes 2000070-106786027/106786028  Date=Mon, 30 Apr 2001 12:55:20 GMT  ETag=W/"02ca57e173c11:95b"  Content-Type=application/octet-stream  Server=Microsoft-IIS/5.0  Last-Modified=Mon, 30 Apr 2001 12:55:20 GMT
이전 서버 에서 돌아 온 정보 와 비교 해 보면 한 줄 이 추 가 된 것 을 발견 할 수 있 습 니 다.  Content-Range=bytes 2000070-106786027/106786028  돌아 오 는 코드 도 200 이 아니 라 206 으로 바 뀌 었 다.
서버 코드:
/* 
	         : Download.jsp 
	   HTTP                    FlashGet    Http://        : 
	        :       
	        :        
	     : 
	   http://blog.csdn.net/images/blog_csdn_net/playyuer/30110/o_FlashGet.gif 
	      ,    FlashGet     : 
	   
	*/ 
	  //                  
	  String s = "I://SetupRes//Sun//j2re-1_4_2_05-windows-i586-p.exe"; 
	  //String s = "e://tree.mdb"; 

	  //    RandomAccessFile      ,         ,     FileInputStream       
	  //java.io.RandomAccessFile raf = new java.io.RandomAccessFile(s,"r"); 

	  java.io.File f = new java.io.File(s); 
	  java.io.FileInputStream fis = new java.io.FileInputStream(f); 

	  response.reset(); 

	  response.setHeader("Server", "[email protected]"); 

	  //                   
	  //      : 
	  //Accept-Ranges: bytes 
	  response.setHeader("Accept-Ranges", "bytes"); 

	  long p = 0; 
	  long l = 0; 
	  //l = raf.length(); 
	  l = f.length(); 

	  //       ,       ,       200,       
	  //      : 
	  //HTTP/1.1 200 OK 

	  if (request.getHeader("Range") != null) //                  
	  { 
	   //               ,                 
	   //      
	   //      : 
	   //HTTP/1.1 206 Partial Content 
	   response.setStatus(javax.servlet.http.HttpServletResponse.SC_PARTIAL_CONTENT);//206 

	   //            
	   //      : 
	   //Range: bytes=[        ]- 
	   p = Long.parseLong(request.getHeader("Range").replaceAll("bytes=","").replaceAll("-","")); 
	  } 

	  //     (  )   
	  //      : 
	  //Content-Length: [      ] - [                 ] 
	  response.setHeader("Content-Length", new Long(l - p).toString()); 

	  if (p != 0) 
	  { 
	   //        , 
	   //      : 
	   //Content-Range: bytes [        ]-[       - 1]/[      ] 
	   response.setHeader("Content-Range","bytes " + new Long(p).toString() + "-" + new Long(l -1).toString() + "/" + new Long(l).toString()); 
	  } 

	  //response.setHeader("Connection", "Close"); //          IE      

	  //         
	  //      : 
	  //Content-Type: application/octet-stream 
	  response.setContentType("application/octet-stream"); 

	  //                  
	  //      : 
	  //Content-Disposition: attachment;filename="[   ]" 
	  //response.setHeader("Content-Disposition", "attachment;filename=/"" + s.substring(s.lastIndexOf("//") + 1) + "/""); //    RandomAccessFile      ,         ,     FileInputStream       
	  response.setHeader("Content-Disposition", "attachment;filename=/"" + f.getName() + "/""); 

	  //raf.seek(p); 
	  fis.skip(p); 

	  byte[] b = new byte[1024]; 
	  int i; 


	  //while ( (i = raf.read(b)) != -1 ) //    RandomAccessFile      ,         ,     FileInputStream       
	  while ( (i = fis.read(b)) != -1 ) 
	  { 
	   response.getOutputStream().write(b,0,i); 
	  } 
	  //raf.close();//    RandomAccessFile      ,         ,     FileInputStream       
	  fis.close(); 

클 라 이언 트 테스트 코드:
public static void down(String URL,long nPos,String savePathAndFile){
 HttpURLConnection conn =null;
 try{
/*  String content="<?xml version=/"1.0/" encoding=/"utf-8/" ?>"
    +"<xmlRequest>"
    +"<header>04</header>"
    +"<body>"
    +"<user userName=/"222/" password=/"222222/" currentVision=/"20101020165216/" >"
    +"</user>"
    +"</body>"
    +"</xmlRequest>";
*/
   conn = (HttpURLConnection)new URL(URL).openConnection();
/*   conn.setRequestProperty("content-type", "text/html");
   conn.setRequestProperty("User-Agent", "NetFox");//   User-Agent
   conn.setRequestProperty("RANGE", "bytes=" + nPos);//            
   conn.setRequestMethod("POST"); //       POST,     GET   
   conn.setDoInput(true);
   conn.setDoOutput(true);   

   OutputStream outStream = conn.getOutputStream();
   PrintWriter out = new PrintWriter(outStream);
   out.print(content);
   out.flush();
   out.close();
*/  
  //      
  InputStream input = conn.getInputStream();
  RandomAccessFile oSavedFile = new RandomAccessFile(savePathAndFile,
    "rw");
  //        nPos  
  oSavedFile.seek(nPos);
  byte[] b = new byte[1024];
  int nRead;
  //           ,       
  while ((nRead = input.read(b, 0, 1024)) > 0) {
   (oSavedFile).write(b, 0, nRead);
  }
  conn.disconnect();
 } catch (MalformedURLException e) {
  e.printStackTrace();
 } catch (IOException e) {
  e.printStackTrace();
 }
}
public static void main(String[] args) {
 String url = "http://localhost:8181/ssoapp/clientRequest";
 String savePath = "e://";
 String fileName = "4.ppt";
 String fileNam = fileName;
 HttpURLConnection conn = null;
 try {
  
 } catch (Exception e) {
  e.printStackTrace();
 }
 File file = new File(savePath + fileName);

 int i = 0;
 if (file.exists()) {
  //          ,  ,   ,    ,   ,    
  long localFileSize = file.length();
  System.out.println("       :" + localFileSize);

  if (localFileSize >0) {
   System.out.println("    ");
   down(url, localFileSize, savePath + fileName);
  } else {
   System.out.println("    ,    ");
   down(url, 0, savePath + fileName);
  }
 } else {
  try {
   file.createNewFile();
   System.out.println("   ");
   down(url, 0, savePath + fileName);
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
}

좋은 웹페이지 즐겨찾기