Java 如何读取压缩了gzip的HTTP响应?

Java 如何读取压缩了gzip的HTTP响应?,java,http,tcp,Java,Http,Tcp,以下代码用于每五秒钟从网站获取一次响应,但根据数据包分析器(如wireshark),结果总是有问题。我猜HTTP响应可能是用GZIP压缩的,读取时可能有问题。当我执行代码时,我可以在Eclipse中获得多个finishized(这意味着读取响应已完成),但根据数据包分析器,我只能发送几个get/1.1)。为什么?如果我注释代码Thread.sleep(1000*5),我会很快看到完成(太快了,根据我的网络速度,这是不正常的),但是GET/1.1仍然很慢。代码怎么了 public class pe

以下代码用于每五秒钟从网站获取一次响应,但根据数据包分析器(如wireshark),结果总是有问题。我猜HTTP响应可能是用GZIP压缩的,读取时可能有问题。当我执行代码时,我可以在Eclipse中获得多个
finishized
这意味着读取响应已完成),但根据数据包分析器,我只能发送几个
get/1.1
)。为什么?如果我注释代码
Thread.sleep(1000*5)
,我会很快看到
完成
(太快了,根据我的网络速度,这是不正常的),但是
GET/1.1
仍然很慢。代码怎么了

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();
    }
}
你没有分配这个任务。 BufferedReader为空; 您需要使用socket.getInputStream()分配is


这里的一个问题是HTTP中的换行符是
\r\n
,而不仅仅是
\n
。另一个问题是,您的请求需要在标题后以一个空行结束。另一种情况是,您正在使用HTTP 1.1,但没有发送内容长度。另一个原因是,您正在将流读取到EOS,然后期望能够编写另一个请求并读取另一个响应。无法工作:EOS表示对等方已关闭连接。您为什么不为此使用
HttpURLConnection

谢谢。但是我想将一个完全定制的HTTP头和内容发布到远程服务器,我想直接写入远程套接字可能更方便。顺便说一句,如何正确读取响应?@MarkZar请参阅编辑,但您可以使用
HttpURLConnection
自定义符合您内心内容的标题,但也有一些例外,例如内容长度适合您,您可以在身体中发送任何您喜欢的内容。
 is = new BufferedReader(new InputStreamReader(socket.getInputStream()));