2013-04-14 4 views
0

Следующий код используется для получения ответа от веб-сайта каждые пять секунд, но всегда есть что-то не так с результатом в соответствии с анализатором пакетов (например, wirehark). Я предполагаю, что, возможно, HTTP-ответ сжимается с помощью GZIP, и при чтении может быть что-то неправильное. Когда я выполняю код, я могу получить несколько Finishied в Eclipse (, что означает, что чтение ответа завершено), но я могу только отправить несколько GET/1.1 согласно пакетному анализатору. Зачем? Если я прокомментирую код Thread.sleep(1000*5);, я увижу Finished очень быстро (слишком быстро, что ненормально по моей скорости сети), но GET/1.1 все еще очень медленный. Что с кодом?Как читать HTTP-ответ с сжатым gzip?

public class pediy { 

    public static void main(String[] args) throws IOException { 

     URL url = new URL("http://bbs.pediy.com"); 
     String request = "GET/HTTP/1.1\r\nHost: bbs.pediy.com\r\nProxy-Connection: keep-alive\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nUser-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.56 Safari/537.17 CoolNovo/2.0.6.12\r\nAccept-Encoding: gzip,deflate,sdch\r\nAccept-Language: en-US;q=0.6,en;q=0.4\r\nAccept-Charset: utf-8;q=0.7,*;q=0.3\r\n"; 

     Socket socket = null; 
     PrintWriter os = null; 
     BufferedReader is = null; 
     InputStreamReader isr = null; 

     while(true) { 

      socket = new Socket(url.getHost(), 80); 
      os = new PrintWriter(socket.getOutputStream()); 
      isr = new InputStreamReader(socket.getInputStream()); 
      is=new BufferedReader(isr); 

      try { 
       while (true) { 

        os.println(request); 
        os.flush(); 


        while(is.read() != -1); 

        System.out.println("Finished"); 

        Thread.sleep(1000*5); 
       } 

      } catch (Exception e) { 
       System.out.println("Error" + e); 
      } finally { 
       CloseAll(socket, os, is, isr); 
      } 
     } 
    } 

    private static void CloseAll(Socket socket, PrintWriter os, BufferedReader is, InputStreamReader isr) throws IOException { 
     if(socket != null) socket.close(); 
     if(os != null) os.close(); 
     if(is != null) is.close(); 
     if(isr != null) isr.close(); 
    } 
} 

ответ

0

Вы не назначили это. BufferedReader = null; вам нужно назначить это с socket.getInputStream()

is = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
+0

О, извините, я вставил неправильный код, я исправил его. :-) – Searene

0

Одна проблема здесь состоит в том, что символ новой строки в HTTP является \r\n, а не только \n. Другое дело, что ваш запрос должен заканчиваться пустой строкой после заголовков. Другое дело, что вы говорите HTTP 1.1, но вы не отправляете Content-Length. Другое дело, что вы читаете поток в EOS, а затем ожидаете, что сможете написать другой запрос и прочитать другой ответ. Это не может работать: EOS означает, что сверстник закрыл соединение. Почему вы не используете HttpURLConnection?

+0

спасибо. Но я хочу опубликовать полностью настраиваемый HTTP-заголовок и контент на удаленном сервере, я подумал, что, возможно, писать в удаленный сокет напрямую удобнее. Кстати, как правильно прочитать ответ? – Searene

+0

@MarkZar См. Редактирование, но вы можете настроить заголовки на содержание вашего сердца с помощью «HttpURLConnection», за некоторыми исключениями, такими как Content-Length, которые он вам подходит, и вы можете отправлять все, что вам нравится в теле. – EJP