【发布时间】:2012-11-23 18:54:14
【问题描述】:
我有以下 Java 代码,它向 Web 服务器发送 HTTP 请求并读取响应:
StringBuilder response = new StringBuilder(50000);
URL url2 = new URL(ServiceURL);
connection = (HttpURLConnection)url2.openConnection();
connection.setRequestMethod("POST");
//... (some more connection settings) ...
BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream(), "UTF-8"));
wr.write(Request);
wr.flush ();
wr.close ();
InputStream is = connection.getInputStream();
BufferedReader rd = new BufferedReader(new InputStreamReader(is));
int i = 0;
while ((i = rd.read()) > 0) {
response.append((char)i);
}
它适用于大多数情况,但我有一个服务器的问题,它返回一个相当大的 XML(大约 500 KB;我想这对于一堆文本来说已经相当大了..),我一直在读超时异常。
我相信这不是网络问题,因为我尝试使用 curl 发出相同的请求,并且响应很快就到达了,大约两秒钟。
当我查看网络中发生的情况(使用wireshark 捕获数据包)时,我注意到我的计算机中的TCP 接收窗口在某些时候已满。 TCP 堆栈有时会幸免于难;我可以看到服务器发送 TCP keep-alive 以保持连接,但最后 TCP 连接中断了。
可能是代码的读取部分(逐个字符附加收到的响应)正在减慢我的代码速度吗?有没有更有效的方法来读取 HTTP 响应?
【问题讨论】:
标签: java http httpurlconnection stringbuilder inputstreamreader