2013-04-14 108 views
0

以下代码用于每五秒钟从网站获取响应,但根据数据包分析器(如wireshark)的结果,总会出现错误。我想也许HTTP响应是用GZIP压缩的,读取它时可能会出错。当我执行代码时,我可以在Eclipse中获得多个Finishied,这意味着读取响应已完成),但根据数据包分析器的不同,我只能发送几个GET/1.1。为什么?如果我对代码Thread.sleep(1000*5);发表评论,我会很快看到Finished(太快了,这是根据我的网络速度异常),但GET/1.1仍然非常慢。代码有什么问题?如何使用gzip压缩读取HTTP响应?

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,但你没有发送一个内容长度。另一个是你正在阅读EOS流,然后期望能够写另一个请求,并阅读另一个响应。这是行不通的:EOS意味着对方已关闭连接。你为什么不用这个HttpURLConnection

+0

谢谢。但我想发布一个完全自定义的HTTP头和内容到远程服务器,我想可能直接写远程套接字更方便。顺便说一句,如何正确读取响应? – Searene

+0

@MarkZar查看编辑,但您可以使用'HttpURLConnection'自定义标题内容,除少数例外情况外,例如Content-Length,您可以在正文中发送任何您喜欢的内容。 – EJP