Scala Remote Actors阻止客户端终止

时间:2010-11-12 22:47:13

标签: scala actor

我正在编写一个简单的聊天服务器,我希望尽可能简单。下面列出的我的服务器只接收连接并将它们存储在客户端集中。然后,将传入的消息广播到该服务器上的所有客户端。服务器没有问题,但在客户端,RemoteActor停止我的程序终止。有没有办法在我的客户端上删除Actor而不终止服务器上的Actor?

我不想使用“每个客户一个演员”模型。

 import actors.{Actor,OutputChannel}
 import actors.remote.RemoteActor

 object Server extends Actor{
  val clients = new collection.mutable.HashSet[OutputChannel[Any]]
  def act{
   loop{
    react{
     case 'Connect =>
      clients += sender
     case 'Disconnect =>
      clients -= sender
     case message:String =>
      for(client <- clients)
      client ! message
    }
   }
  }

  def main(args:Array[String]){
   start
   RemoteActor.alive(9999)
   RemoteActor.register('server,this)
  }
 }

我的客户端看起来像这样

val server = RemoteActor.select(Node("localhost",9999),'server)
server.send('Connect,messageHandler) //answers will be redirected to the messageHandler
/*do something until quit*/
server ! 'Disconnect

1 个答案:

答案 0 :(得分:0)

我建议将客户端代码放入actor本身 - 即不在主线程中调用alive / register

(由http://www.scala-lang.org/api/current/scala/actors/remote/RemoteActor$.html暗示)

类似

//body of your main: 
val client = actor { 
   alive(..)
   register(...)
   loop { 
       receive {
           case 'QUIT => exit()
       }
    } 
}
client.start
//then to quit:
client ! 'QUIT

或类似(对不起,我没有使用2.8,所以可能搞砸了一些东西 - 如果你让它真的适合你,可以随意编辑!)。