2013-02-10 2 views
0

URL에서 파일을 다운로드 할 수있는 프로그램을 Java로 작성하려고합니다. 대신 URLConnection을 사용하지 않고이 작업을 수행하려고합니다. 대신 TCP 소켓 만 사용하고 있습니다. GET 요청을 보내고 서버의 응답을 얻는 데 성공했지만 HTTP 헤더 (파일 만)가없는 응답에서 파일을 저장하지 못하는 것 같습니다.헤더를 포함하지 않고 HTTP 응답에서 보낸 파일을 저장하는 방법

import java.net.*; 
import java.io.*; 

public class DownloadClient { 
    public static void main(String[] args) { 
     try { 
      if (args.length != 3) { 
       System.out.println(
        "Use: java DownloadClient <host> <port> <filename/path>" 
       ); 
      } else { 
       // Sorting out arguments from the args array 
       String host; 
       int port; 
       String filename; 
       if (args[0].charAt(args[0].length()-1) == '/') { 
        host = args[0].substring(0,args[0].length()-1); 
       } else { 
        host = args[0]; 
       } 
       port = Integer.parseInt(args[1]); 
       if (args[2].charAt(0) == '/') { 
        filename = args[2]; 
       } else { 
        filename = "/"+args[2]; 
       } 

       Socket con = new Socket(args[0], Integer.parseInt(args[1])); 

       // GET request 
       BufferedWriter out = new BufferedWriter(
        new OutputStreamWriter(con.getOutputStream(), "UTF8") 
       ); 
       out.write("GET "+filename+" HTTP/1.1\r\n"); 
       out.write("Host: "+host+"\r\n"); 
       out.write("User-Agent: Java DownloadClient\r\n\r\n"); 
       out.flush(); 

       InputStream in = con.getInputStream(); 
       BufferedReader = 
       OutputStream outputFile = new FileOutputStream(
        filename.substring(filename.lastIndexOf('/')+1) 
       ); 
       byte[] buffer = new byte[1024]; 
       int bytesRead = 0; 

       while((bytesRead = in.read(buffer)) > 0) { 
        outputFile.write(buffer, 0, bytesRead); 
        buffer = new byte[1024]; 
       } 

       outputFile.close(); 
       in.close(); 
       con.close(); 
      } 
     } catch (IOException e) { 
      System.err.println(e); 
     } 
    } 
} 

가 나는 내용이 시작되기 직전에 빈 줄을 나타냅니다으로 어떻게 든 \ r에 \ n을 \ r에 \ n을 찾아해야한다고 생각한다. 지금까지이 프로그램은 모든 http 응답을 포함하는 파일을 생성합니다.

+1

사실, 자신의 HTTP 스택을 롤업하려면 RFC를 따라야합니다. http://www.w3.org/Protocols/rfc2616/rfc2616.html – home

답변

3

Socket을 사용하여 웹 서버와 대화를 시도하지 않는 것이 좋습니다. 기존 클라이언트 측 HTTP 스택 중 하나를 사용하십시오. 예 : 표준 HttpUrlConnection 스택 또는 Apache HttpClient 스택.

평범한 소켓을 사용하여 대화하려고한다면 HTTP 사양에 따라 모든 응답 및 기타 모든 부분에서 "헤더"행을 처리/처리해야합니다.

콘텐츠 시작 직전에 빈 줄을 표시하므로 어떻게 든 \r\n\r\n을 찾아야합니다.

그래

...

그리고 당신은 또한 잠재적으로 압축 된 응답 등 예상치 못한 문자 집합하는 3xx의 리디렉션 등을 사용하여 응답을 보내는 서버를 처리해야합니다.

+0

글쎄, 웹 기술을 배우고 있습니다. , 실제로 이것은 단지 실험적입니다. 하지만 어떻게하면 \ r \ n \ r \ n을 정확히 찾을 수 있습니까? 나는 프로그래밍에 익숙하지 않고, 이번 여름에 막 시작했습니다. –

+0

바이트를 (읽었을 때 또는 파일에 쓰기 전에) 검사하고 "\ r \ n \ r \ n"을 의미하는 바이트 순서를 찾아야합니다. 그것은 단지 프로그래밍입니다 ... –

관련 문제