【问题标题】:Catching connection issues (and network I/O issues) in java BufferedReader?在 java BufferedReader 中捕获连接问题(和网络 I/O 问题)?
【发布时间】:2013-04-08 17:54:58
【问题描述】:

注意:用 Scala 表示。使用BufferedReader 处理压缩的HTTP 流并遍历每一行以读取传入数据。问题是,如果由于网络 I/O 问题(提供商有时会做奇怪的事情)而重置连接,那么我可以看到连接在超时前保持打开状态长达 15 秒,这是我想要的降至 1 秒。出于某种原因,我们的办公室提供商每 11 小时重置一次连接。

这是我处理连接的方式:

val connection = getConnection(URL, USER, PASSWORD)
      val inputStream = connection.getInputStream()
      val reader = new BufferedReader(new InputStreamReader(new StreamingGZIPInputStream(inputStream), GNIP_CHARSET))
      var line = reader.readLine()
      while(line != null){
          parseSupervisor ! ParseThis(line)
          line = reader.readLine()
      }
      throw new ParseStreamCollapseException

这里定义了getConnection

private def getConnection(urlString: String, user: String, password: String): HttpURLConnection = {
    val url = new URL(urlString)

    val connection = url.openConnection().asInstanceOf[HttpURLConnection]
    connection.setReadTimeout(1000 * KEEPALIVE_TIMEOUT)
    connection.setConnectTimeout(1000 * 1)

    connection.setRequestProperty("Authorization", createAuthHeader(user, password));
    connection.setRequestProperty("Accept-Encoding", "gzip")
    connection
  }

总结一下:通过java.io.BufferedReader逐行读取HTTP流。流上的保持活动时间为 16 秒,但为了防止进一步的数据丢失,我希望将其缩小到 1-2 秒(基本上检查流当前是否为空白或网络 I/O)。中间的某些设备每 11 小时终止一次连接,如果有一个有意义的解决方法来最大程度地减少数据丢失,那就太好了。 HttpURLConnection 在连接上没有收到“终止信号”。

谢谢!

【问题讨论】:

    标签: java scala inputstream http-streaming


    【解决方案1】:

    不幸的是,除非终止连接的网络设备干净利落地关闭它,否则您不会收到任何形式的连接已终止的通知。这样做的原因是,没有办法区分只需要很长时间响应的远程主机和断开的连接之间的区别。无论哪种方式,套接字都是静默的。

    同样,假设连接刚刚被切断,您唯一能更快检测到断开连接的选择是减少超时。

    【讨论】:

    • 该死,我还以为是这样。感谢您让我知道,我将不得不向我们的供应商施压以获得更多宽容的联系。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-24
    • 2011-06-28
    • 2018-04-21
    • 2013-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多