开发者

Scala Remote Actors stop client from terminating

I am writing a simple chat server, and I want to keep it as simple as possible. My server listed below only receives connections and stores them in the clients set. Incoming messages are then broadcasted to all clients on that Server. The server works with no problem, but on the client side, the RemoteActor stops my program from termination. Is there a way to remove the Actor on my client without terminating the Actor on the Server?

I don't want to use a "one actor per client" model yet.

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

 object Server extends Actor{
  val clients = new collection.mutable.HashSet[OutputChannel[Any]]
  def act{
   loop{
    r开发者_StackOverfloweact{
     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)
  }
 }

my client would then look like 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


I would suggest placing the client side code into an actor itself - ie not calling alive/register in the main thread

(implied by http://www.scala-lang.org/api/current/scala/actors/remote/RemoteActor$.html)

something like

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

Or similar (sorry I am not using 2.8 so might have messed something up - feel free to edit if you make it actually work for you !).

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜