2017-03-09 77 views
2

Stream.continually返回空,如果in.readLine時間超過1 minute流不斷只讀取1分鐘

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


結論(後調試這個錯誤)

這有什麼好做流。它也不與SSLSocketFactorySSLSocket有任何關係。這是代理中的超時問題。我弄錯了。

+0

's'是什麼?一個更完整的例子會更容易嘗試。 –

+0

@Michael,我添加了完整的代碼 – orange14

+0

我不認爲這是一個'Stream'問題。如果從REPL調用Stream.continually(io.StdIn.readLine)...',它將無限期地等待。 – jwvh

回答

2

這實際上與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,給定一個空序列,將產生一個空字符串。

+0

你說得對。它與Steam無關。 – orange14