자바 단점 속전 의 원리 실현
서버 가 요청 을 받 은 후 요청 한 파일 을 찾 아 파일 의 정 보 를 추출 한 후 브 라 우 저 에 게 돌아 가 다음 과 같은 정 보 를 되 돌려 줍 니 다.
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();
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.