我正在尝试编写一个Connector
类,它将为我提供一个基于文本的 IO 来往一个服务器,该服务器本身只以文本通信。所以,基本上,一个telnet
克隆。到目前为止,我已经写了这个:
import java.net._
import scala.actors.Actor
import Actor._
import java.io._
class Connector(socket: Socket, handler: String => Unit) {
private val out = new PrintStream(socket.getOutputStream)
private val in = new BufferedReader(new InputStreamReader(socket.getInputStream))
private val receiver = actor {
var msg = in.readLine
while (msg != null) {
handler(msg)
msg = in.readLine
}
}
def print(msg: String) = out.println(msg)
def close = {
in.close
out.close
}
}
我现在尝试用这个连接到服务器(用于测试)
import java.net._
import java.io._
import InetAddress.getByName
object Main extends App {
val addr = getByName("wolfwings.us")
val socket = new Socket(addr, 4000)
val connector = new Connector(socket, ((msg) => println(msg)))
val stdIn = new BufferedReader(new InputStreamReader(System.in))
var input = stdIn.readLine
while(input != null) {
connector.print(input)
input = stdIn.readLine
}
stdIn.close
connector.close
}
发生的事情是:它正确连接并向我发送服务器的问候屏幕。然后它停在文本中间。当我现在输入时,它会输出问候文本的最后一行,然后是剩下的,减去最后一行。等等。\n
此外,它在每一行后面都放了额外的东西。当我用 替换println
时,突然print
没有s。\n
据我所知,这一切都应该正常工作。我的意思是,这不是像这样的简单文本IO是高级巫术吗?我在这里不知道哪些隐藏的怪癖?
编辑:更正:经过一些尝试和研究,我发现实际上,该程序只吞噬了服务器响应的最后一行。似乎服务器本身有时不会发送完整的行,所以客户端当然会读取它们。