我有以下 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(大约 500KB;我想这对于一堆文本来说已经相当大了......)的问题,我一直在阅读超时异常。
我相信这不是网络问题,因为我已经尝试使用 curl 发出相同的请求并且响应很快就到达了,大约两秒钟。
当我查看网络中发生的情况(使用 wireshark 捕获数据包)时,我注意到计算机中的 TCP 接收窗口有时会变满。 TCP 堆栈有时会幸存下来;我可以看到服务器发送 TCP keep-alive 以保持连接,但最终 TCP 连接中断。
会不会是代码的读取部分(逐个字符地附加接收到的响应)拖慢了我的代码速度?有没有更有效的方法来读取 HTTP 响应?
最佳答案
是的,一个字符一个字符地阅读是很慢的。尝试一次将 block 读入缓冲区:
char[] buf = new char[2048];
int charsRead;
while((charsRead = rd.read(buf, 0, 2048)) > 0) {
response.append(buf, 0, charsRead);
}
关于java - 使用 InputStreamReader 和 BufferedReader 缓慢读取 HTTP 响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13534452/