2011-06-21 40 views
2

我想做一个客户端,可以发送HTTP请求,并从Web服务器接收响应。我尝试过使用Java的HttpURLConnection类,但它并不能完全控制实际发送到服务器的内容,所以我想编写自己的HTTP请求消息并通过Socket发送它们。然而,从Socket的InputStream中读取某些服务器的速度非常慢,如果可能的话,我想尽快加快速度。下面是一些代码,我用来测试有多慢读是套接字相比,HttpURLConnection类:试图加快读取从一个套接字在java

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

你为什么不使用现有的馆藏?他们已经有了很好的代码,比如[HTTPClient](http://hc.apache.org/httpcomponents-client-ga/)或者JF Arcand的AsyncHTTPClient(你可以在github上找到它) – Grooveek

+1

'HttpURLConnection'为你提供完整的控制发送到服务器的内容。您可以指定所需的方法和标题,并且可以覆盖库选择的默认标题值。而且,正如您已经看到的那样,您不需要具备底层协议的详细知识即可使其正常工作。 – erickson

+0

@Grooveek我不知道HTTPClient。我会研究它。 – Kevin

回答

4

因此,HTTP/1.1会默认为客户端请求启用keepalive。在你的套接字例子中,你发送HTTP/1.1作为你的版本字符串,所以你隐式地接受你可以支持keepalive,但你完全忽略它。

基本上,您阻止试图从服务器读取更多的,尽管服务器等待你做某件事(或发送另一个请求或关闭连接。)

你需要或者发送标题“Connection:close”或发送HTTP/1.0作为您的版本字符串。

+0

谢谢!这完全解决了我的问题。 – Kevin

+0

@Kevin,'Edward'的回答后,这是否使'套接字'的方式更快? –