试图加快java中Socket的读取速度

时间:2011-06-21 16:50:07

标签: java sockets

我正在尝试创建一个可以发送HTTP请求并从Web服务器接收响应的客户端。我尝试使用Java的HttpURLConnection类,但它没有给我足够的控制权,实际上发送到服务器的内容,所以我想编写自己的HTTP请求消息并通过Socket发送它们。但是,对于某些服务器来说,从Socket的InputStream读取速度非常慢,而且如果可能的话,我想加快速度。这里有一些代码用于测试与HttpURLConnection相比读取器的读取速度:

public static void useURLConnection() throws Exception
{
    URL url = new URL("http://" + hostName + "/");
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    InputStream in = conn.getInputStream();
    byte[] buffer = new byte[buffersize];
    long start = System.currentTimeMillis();
    while(in.read(buffer) != -1) { }
    System.out.println(System.currentTimeMillis() - start);
}

public static void useSocket() throws Exception
{
    byte[] request = ("GET / HTTP/1.1\r\nHost: " + hostName + "\r\n\r\n").getBytes();
    Socket socket = new Socket(hostName, 80);
    OutputStream out = socket.getOutputStream();
    InputStream in = socket.getInputStream();
    out.write(request);
    byte[] buffer = new byte[buffersize];
    long start = System.currentTimeMillis();
    while(in.read(buffer) != -1) { }
    System.out.println(System.currentTimeMillis() - start);
}

对于某些服务器(例如www.wikipedia.org),这两种方法的运行时间大致相同,但是对于其他服务器(例如www.google)来说,从套接字读取速度要慢得多 - 分钟而不是毫秒.COM。有人可以解释为什么会这样,也许可以给我一些指示,如果有的话,我可以做些什么来加速从套接字的读取?感谢。

1 个答案:

答案 0 :(得分:4)

因此,HTTP / 1.1默认为客户端请求打开keepalive。在您的套接字示例中,您将HTTP / 1.1作为版本字符串发送,因此您隐含地接受了您可以支持keepalive,但您完全无视它。

基本上,尽管服务器正在等待您做某事(发送另一个请求或关闭连接),但您仍然阻止尝试从服务器读取更多信息。

您需要发送标题"连接:关闭"或发送HTTP / 1.0作为您的版本字符串。