在Java BufferedReader中捕获连接问题(和网络I / O问题)?

时间:2013-04-08 17:54:59

标签: java scala inputstream http-streaming

注意:用Scala表示。使用BufferedReader处理gzip压缩的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在连接上没有收到“终止信号”。

谢谢!

1 个答案:

答案 0 :(得分:1)

不幸的是,除非正在杀死连接的网络设备干净地关闭它,否则你不会得到任何关于连接已经死亡的通知。这样做的原因是没有办法区分刚刚响应很长时间的远程主机和断开的连接。无论哪种方式,套接字都是静默的。

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