2011-03-28 41 views
3

我已经创建了一个应用程序,该应用程序向URL发送GET请求,然后下载该页面的完整内容。TCP连接不能用于HttpURLConnection的HTTP请求

客户端发送GET给例如并将响应转发给解析器,解析器具有从后续GET请求中查找需要下载的页面中的所有源的责任。

以下方法用于发送这些GET请求。它被连续多次调用,解析器返回URL。这些URL中的大多数位于同一主机上,并且应该能够共享TCP连接。

public static void sendGetRequestToSubObject(String RecUrl) 
    { 
     URL url = new URL(recUrl.toString()); 
     URLConnection connection = url.openConnection(); 
     InputStreamReader isr = new InputStreamReader(connection.getInputStream()); 
    } 

每次调用此方法时,都会创建一个新的TCP连接(使用TCP 3次握手),然后在该连接上发送GET。但我想重用TCP连接,以提高性能。

我想,既然我创建了一个新的URL每个方法被调用时的对象,这是它去上班的路上...

也许有人可以帮我做这更好的办法?

谢谢!

回答

5

HttpURLConnection重用连接if it can

为此,需要满足几个前提条件,主要是在服务器端。这些先决条件在上面链接的文章中描述。

+0

谢谢!我已经阅读过这份文件,我认为前提条件已经实现。我知道服务器满足它们,因为我试图通过几种不同的浏览器(IE,Chrome,FIrefox)访问URLS,并且在所有情况下,TCP连接都被重用于多个HTTP GET。 – plithner 2011-03-28 16:59:13

+0

我仍然认为我在代码中做错了什么......就像为每个URL创建一个新的URL对象一样。它感觉不对,但我无法以其他方式去做。 – plithner 2011-03-28 17:00:44

+0

@user:由于'URL'对象不能被修改,所以你必须每次创建一个新对象,所以这当然不是问题。 – 2011-03-28 18:31:35

1

发现问题!我没有正确读取输入流。这导致输入流对象挂起,并且它们不能被重用。

我只定义了它,就像这样:

InputStreamReader isr = new InputStreamReader(connection.getInputStream()); 

但我从来没有从中读取:-)

我改读法为好。相反,缓冲读者的我偷了这一点:

InputStream in = null; 
String queryResult = ""; 
try { 
    URL url = new URL(archiveQuery); 
    HttpURLConnection urlConn = (HttpURLConnection) url.openConnection(); 
    HttpURLConnection httpConn = (HttpURLConnection) urlConn; 
    httpConn.setAllowUserInteraction(false); 
    httpConn.connect(); 
    in = httpConn.getInputStream(); 
    BufferedInputStream bis = new BufferedInputStream(in); 
    ByteArrayBuffer baf = new ByteArrayBuffer(50); 
    int read = 0; 
    int bufSize = 512; 
    byte[] buffer = new byte[bufSize]; 
    while(true){ 
     read = bis.read(buffer); 
     if(read==-1){ 
      break; 
     } 
     baf.append(buffer, 0, read); 
    } 
    queryResult = new String(baf.toByteArray()); 
    } catch (MalformedURLException e) { 
      // DEBUG 
      Log.e("DEBUG: ", e.toString()); 
    } catch (IOException e) { 
      // DEBUG 
      Log.e("DEBUG: ", e.toString()); 
    } 
} 

从这里:Reading HttpURLConnection InputStream - manual buffer or BufferedInputStream?