首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TCP连接不会重复用于带有HttpURLConnection的HTTP请求

TCP连接不会重复用于带有HttpURLConnection的HTTP请求
EN

Stack Overflow用户
提问于 2011-03-28 20:44:02
回答 2查看 9.5K关注 0票数 5

我已经创建了一个应用程序,它将GET请求发送到一个URL,然后下载该页面的完整内容。

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

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

代码语言:javascript
复制
public static void sendGetRequestToSubObject(String RecUrl)
    {
        URL url = new URL(recUrl.toString());
        URLConnection connection = url.openConnection ();
        InputStreamReader isr = new InputStreamReader(connection.getInputStream());
    }

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

我猜,因为我每次调用该方法时都会创建一个新的URL对象,所以它就是这样工作的……

也许有人能帮我以更好的方式做这件事?

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2011-03-28 20:47:56

HttpURLConnection 将重用connections if it can

要实现这一点,需要满足几个前提条件,主要是在服务器端。以上链接的文章中描述了这些前提条件。

票数 6
EN

Stack Overflow用户

发布于 2011-03-30 01:39:58

找到问题了!我没有正确读取输入流。这会导致输入流对象挂起,并且无法重用。

我只定义了它,像这样:

代码语言:javascript
复制
InputStreamReader isr = new InputStreamReader(connection.getInputStream());

但我从来没有读过它:-)

我还更改了read方法。我没有使用缓冲阅读器,而是偷走了这个:

代码语言:javascript
复制
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?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5459162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档