2013-02-10 2 views
0

Я пытаюсь написать программу в java, которая может загрузить файл с URL-адреса. Я хочу сделать это без использования 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); 
     } 
    } 
} 

Я думаю, что я должен каким-то образом найти \ г \ п \ г \ п, как это указывает на пустую строку непосредственно перед началом содержания. Пока эта программа создает файл, содержащий весь 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». Это просто программирование ... –

Смежные вопросы