【问题标题】:Stream Continually only reads for 1 minuteStream Continually 仅读取 1 分钟
【发布时间】:2017-03-09 15:29:58
【问题描述】:

如果in.readLine 花费的时间超过1 minuteStream.continually 返回空字符串

val f = SSLSocketFactory.getDefault.asInstanceOf[SSLSocketFactory]
val s = f.createSocket(ip, port).asInstanceOf[SSLSocket]
 s.startHandshake()
 s.setTcpNoDelay(true)
 val out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream))
 val in  = new BufferedReader(new InputStreamReader(s.getInputStream))

 val in  = new BufferedReader(new InputStreamReader(s.getInputStream))    
 Stream.continually(in.readLine()).takeWhile(_ != null).mkString

为什么会这样?

我可以用一些属性来改变它吗?

我已经阅读了整个 Stream 文档,但我认为我可能遗漏了一些东西。

我也尝试过添加s.setSoTimeout(300000) 我还阅读了SSLSocketFactory 的官方文档,但找不到任何默认的 TimeOut。也没有找到SSLSocket


结论(调试此错误后)

这与 Stream 无关。它与SSLSocketFactorySSLSocket 也没有任何关系。这是代理中的超时问题。我全都错了。

【问题讨论】:

  • 什么是s?一个更完整的例子会更容易尝试。
  • @Michael,我已经添加了完整的代码
  • 我认为这不是Stream 问题。如果您从 REPL 调用 Stream.continually(io.StdIn.readLine)...,它将无限期等待。
  • @jwvh 你认为它与 SSLSocket 有什么关系吗?

标签: scala stream bufferedreader


【解决方案1】:

这实际上与Stream 无关。尝试将 Stream 从您的代码中删除:

val ip = "74.125.141.147" // google
val port = 443

val f = SSLSocketFactory.getDefault.asInstanceOf[SSLSocketFactory]
val s = f.createSocket(ip, port).asInstanceOf[SSLSocket]
s.startHandshake()
s.setTcpNoDelay(true)

val out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream))
val in  = new BufferedReader(new InputStreamReader(s.getInputStream))

println {
  in.readLine()
}

这最终会打印出null,因为它应该(我认为当遥控器感到无聊并挂断时)。

发生的事情是mkString,给定一个空序列,将产生一个空字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-24
    • 2015-06-24
    • 1970-01-01
    • 1970-01-01
    • 2018-02-21
    • 2019-10-08
    • 2022-08-17
    相关资源
    最近更新 更多