我在 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 响应?