Scala Remote Actors не позволяют клиенту завершить работу - PullRequest
2 голосов
/ 13 ноября 2010

Я пишу простой чат-сервер и хочу сделать его максимально простым. Мой сервер, указанный ниже, только получает соединения и сохраняет их в наборе клиентов. Входящие сообщения затем передаются всем клиентам на этом сервере. Сервер работает без проблем, но на стороне клиента 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 голосов
/ 14 ноября 2010

Я бы предложил разместить код на стороне клиента в самом акторе - т.е. не вызывать живого / зарегистрироваться в основном потоке

(подразумевается http://www.scala -lang.org / api / current / scala / актеры / 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, так что, возможно, что-то напутало - не стесняйтесь редактировать, если вы заставите это действительно работать для вас!).

...