1

注意:用 Scala 表示。使用 aBufferedReader处理压缩后的 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. 在流上保持活动状态为 16 秒,但为了防止进一步的数据丢失,我希望将其缩小到 1-2 秒(基本上检查流当前是否为空白或网络 I/O)。中间的某些设备每 11 小时终止一次连接,如果有一个有意义的解决方法来最大程度地减少数据丢失,那就太好了。在HttpURLConnection连接上没有收到“终止信号”。

谢谢!

4

1 回答 1

1

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

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

于 2013-04-08T18:05:33.107 回答