4

我正在尝试编写一个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是高级巫术吗?我在这里不知道哪些隐藏的怪癖?

编辑:更正:经过一些尝试和研究,我发现实际上,该程序只吞噬了服务器响应的最后一行。似乎服务器本身有时不会发送完整的行,所以客户端当然会读取它们。

4

1 回答 1

1

我已经为自己修复了它,似乎我做了很多没有得到满足的假设。

  private val receiver = actor {
    var done = false
    while (!done) {
      val n = in.read
      if(n < 0)
        done = true
      else
        handler(n.toChar)
    }
  }

现在它似乎工作正常,我可以继续。

于 2012-11-12T12:53:35.073 回答