演员和网络问题

时间:2011-07-30 10:34:20

标签: networking scala actor

我正在处理的ChatServer程序有一个奇怪的问题(不知道为什么我突然启动它但我想完成它)。首先,这是相关的代码:

sealed trait ServerMessage

case class Message(msg: String) extends ServerMessage

case object Quit extends ServerMessage

sealed trait ClientMessage

case class Incoming(conn: Connection, msg: String) extends ClientMessage

case class Remove(conn: Connection) extends ClientMessage

object Server extends App with Actor with Settings {
  Console.println(greeting)
  Console.println("Server starting up...")

  val socket = new ServerSocket(defaultPort);
  var connections: Set[Connection] = Set.empty

  start

  actor {
    loop {
      val s = socket.accept
      val c = Connection(s)
      Console.println("New Connection from " + s.getInetAddress)
      c ! Message(greeting)
      connections += c
    }
  }

  def act = loop {
    receive {
      // For some reason, this only works once
      case Incoming(conn, msg) => {
        Console.println(conn.socket.getInetAddress.toString + " said: " + msg)
        connections.foreach(_ ! Message(msg))
      }
      case Remove(conn) => connections -= conn; conn ! Quit
    }
  }
}

case class Connection(socket: Socket) extends Actor {
  val in = new BufferedReader(new InputStreamReader(socket.getInputStream))
  val out = new PrintWriter(socket.getOutputStream)

  start

  actor {
    var s: String = in.readLine
    while (s != null) {
      // This output works
      scala.Console.println(s)
      if (s == "quit") Server ! Remove(this)
      else Server ! Incoming(this, s)
      s = in.readLine
    }
  }

  def act = {
    var done = false
    while (!done) {
      receive {
        // This seems to work all the time (I can send several messages)
        case Message(str) => out.println(str); out.flush
        case Quit => done = true
      }
    }
    in.close
    out.close
    socket.close
  }
}

我遇到的问题是当我通过telnet连接到它时,我可以发送1条消息,然后它会回复给我。但在那之后,当我发送更多信息时,他们不会回复我。在调试消息的帮助下,我可以确定问题所在,但我完全看不出它为什么不起作用。

也许有人可以给我一个提示?这是我第一次以如此复杂的方式使用演员。

编辑:这可能与receivereact函数永远不会返回的事实有关吗?

1 个答案:

答案 0 :(得分:1)

尝试将receive替换为react