【问题标题】:Java HttpUrlConnection.getInputStream() delayJava HttpUrlConnection.getInputStream() 延迟
【发布时间】:2015-04-15 09:24:59
【问题描述】:

我得到了与HttpURLConnection getInputStream() has one second delay 中描述的非常相似的行为:在 Java 中获取 http 连接的 InputStream 会导致至少 500 毫秒的延迟。 InputStreams 已正确关闭。使用 apache httpclient 实现也解决了这个问题。不幸的是,替换并不适合我的每个用例。

此外,延迟不会出现在每个设置中。我目前的观察如下:

  • 使用 httpclient 库就像一个魅力
  • 在服务器端使用 Windows Server 2012 R2 不会导致 W7 Professional 和 W7 Enterprise 延迟
  • 客户端的 Java 版本无关紧要(32 位/64 位,7/8)
  • 在客户端使用 Windows 7 Enterprise 或 Linux 非常棒
  • 在客户端使用 Windows 7 Professional,在主机端使用 Linux 机器会导致(至少)500 毫秒延迟

此外,在服务器端批发Linux是没有解决办法的,使用Windows 7专业版不会出现问题。

我使用wireshark监控网络流量以发现差异但没有成功:延迟发生在客户端完全收到响应后。

最后,问题是:Windows 7 Professional 的(网络堆栈)存在导致这种行为的限制吗?是否可以调整 Windows 设置以免延迟发生?

【问题讨论】:

    标签: java linux windows network-programming


    【解决方案1】:

    老实说,我忘记了这个问题,但由于它在几周后得到解决,我想提供背景。

    问题是客户端的防病毒程序 (avira) 配置错误。该扫描仪监控典型端口 80、443 和 8080 上的 http 流量,从而增加了客户端的延迟。

    windows 服务器上运行的软件的服务器端被配置为侦听防病毒程序完全忽略的端口 9090。

    所以解决方案是告诉防病毒程序不要扫描 http 流量。

    【讨论】:

      【解决方案2】:

      您需要了解,在调用以下之一之前不会创建 TCP 连接:

      • getOutputStream()
      • getInputStream()
      • getErrorStream()
      • getResponseCode()

      因此,您看到的延迟是 TCP 握手延迟。在您的代码中您无能为力。

      【讨论】:

      • 感谢您的回复!但我认为我需要澄清一些事情:调用 getInputStream(),TCP 握手以及服务器的请求和响应在调用 getInputStream() 后立即发生(由 Wireshark 验证;实际上,我正在调用 getResponseCode( ),它本身调用 getInputStream())。延迟发生在收到最后一个网络包之后
      • 那么你的问题是什么?我回答了你问的那个:'getInputStream() 导致延迟'。
      • 我只在 Windows 7 Professional 上遇到了延迟,而在 Enterprise Edition 上没有。我想知道是否有什么我可以做的。
      • 好的,我不能在我的代码中做某事。但是由于Windows 7企业版没有问题,请问您知道这个问题是Windows 7专业版的限制还是存在消除延迟的Windows系统设置?
      • 延迟是 TCP 握手延迟,也是传输请求、在服务器创建响应和传输响应的时间。在客户端,您无能为力。
      猜你喜欢
      • 2023-03-31
      • 2012-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-27
      • 2021-04-23
      相关资源
      最近更新 更多