Java HttpUrlConnection.getInputStream() 延迟
Java HttpUrlConnection.getInputStream() delay
我得到了与 中描述的非常相似的行为:在 Java 中获取 http 连接的 InputStream 会导致至少 500 毫秒的延迟。 InputStreams 已正确关闭。使用 apache httpclient 实现也解决了这个问题。不幸的是,替换并不适合我的每个用例。
此外,延迟不会出现在每个设置中。目前我的观察如下:
- 使用 httpclient 库非常棒
- 在服务器端使用 Windows Server 2012 R2 不会导致延迟,无论是 W7 Professional 还是 W7 Enterprise
- Java 客户端版本无关紧要(32 位/64 位,7/8)
- 在客户端使用 Windows7 Enterprise 或 Linux 非常有效
- 在客户端使用 Windows7 Professional 并在主机端使用 Linux 框导致(至少)500 毫秒延迟
另外,在服务器端批Linux也不是解决办法,用Windows7专业版也没有出现这个问题。
我用 wireshark 监控网络流量以找出差异但没有成功:延迟发生在客户端完全收到响应后。
最后,问题:Windows7 Professional(的网络堆栈)是否存在导致此行为的限制?是否可以调整 Windows 设置以防止延迟发生?
您需要了解,在您调用以下方法之一之前,不会创建 TCP 连接:
getOutputStream()
getInputStream()
getErrorStream()
getResponseCode()
因此,您看到的延迟是 TCP 握手延迟。在您的代码中对此无能为力。
老实说,我忘记了这个问题,但由于它在几周后得到解决,我想提供背景信息。
问题是客户端的防病毒程序 (avira) 配置错误。该扫描器监控典型端口 80、443 和 8080 上的 http 流量,在客户端增加延迟。
windows 服务器上软件 运行 的服务器端配置为侦听防病毒程序完全忽略的端口 9090。
所以解决方案是告诉防病毒程序不要扫描 http 流量。
我得到了与 中描述的非常相似的行为:在 Java 中获取 http 连接的 InputStream 会导致至少 500 毫秒的延迟。 InputStreams 已正确关闭。使用 apache httpclient 实现也解决了这个问题。不幸的是,替换并不适合我的每个用例。
此外,延迟不会出现在每个设置中。目前我的观察如下:
- 使用 httpclient 库非常棒
- 在服务器端使用 Windows Server 2012 R2 不会导致延迟,无论是 W7 Professional 还是 W7 Enterprise
- Java 客户端版本无关紧要(32 位/64 位,7/8)
- 在客户端使用 Windows7 Enterprise 或 Linux 非常有效
- 在客户端使用 Windows7 Professional 并在主机端使用 Linux 框导致(至少)500 毫秒延迟
另外,在服务器端批Linux也不是解决办法,用Windows7专业版也没有出现这个问题。
我用 wireshark 监控网络流量以找出差异但没有成功:延迟发生在客户端完全收到响应后。
最后,问题:Windows7 Professional(的网络堆栈)是否存在导致此行为的限制?是否可以调整 Windows 设置以防止延迟发生?
您需要了解,在您调用以下方法之一之前,不会创建 TCP 连接:
getOutputStream()
getInputStream()
getErrorStream()
getResponseCode()
因此,您看到的延迟是 TCP 握手延迟。在您的代码中对此无能为力。
老实说,我忘记了这个问题,但由于它在几周后得到解决,我想提供背景信息。
问题是客户端的防病毒程序 (avira) 配置错误。该扫描器监控典型端口 80、443 和 8080 上的 http 流量,在客户端增加延迟。
windows 服务器上软件 运行 的服务器端配置为侦听防病毒程序完全忽略的端口 9090。
所以解决方案是告诉防病毒程序不要扫描 http 流量。