Java Socket read() 在返回 -1 并完成时如何花费很长时间?

mpa*_*raz 1 java sockets

我正在 HTTP 服务器上做一些基准测试。为了避免与 HTTP 库的潜在冲突,我直接使用 Socket 打开连接,没有 HTTP 持久连接。

Java 代码打开并连接InputStream到已加载的 HTTP 服务器的套接字上。它在 Linux 上运行。

我看到这两种情况都可能发生:

  • 套接字连接(new Socket())可能需要很长时间。如果服务器在接受新连接方面有积压,这是有道理的。
  • 套接字连接速度很快,但是当 read() 返回 -1 以表示流位于“文件”末尾时,最后一次读取的延迟高达 1500 毫秒。这我不明白。

代码遵循标准,添加了一些时序代码:

final byte[] buffer = new byte[8192];
int size = inputStream.read(buffer);

while (size > 0) {
    // Copy the buffer
    size = inputStream.read(buffer);
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*rtz 5

read在您已经收到服务器将要发送的所有数据之后,您正在调用。这是个错误。收到完整回复(由 HTTP 协议确定)后,您应该停止调用read. 您正在等待连接超时,这很愚蠢。

HTTP 协议会告诉您何时收到完整回复,而不是 TCP 协议。您期望 TCP 堆栈理解 HTTP。它不是。它不知道您何时收到完整答复。