2010-11-12 6 views
2

J'écris un simple serveur de chat, et je veux le garder aussi simple que possible. Mon serveur répertorié ci-dessous reçoit uniquement les connexions et les stocke dans l'ensemble des clients. Les messages entrants sont ensuite diffusés à tous les clients sur ce serveur. Le serveur fonctionne sans problème, mais du côté client, RemoteActor arrête mon programme de la fin. Est-il possible de supprimer l'acteur sur mon client sans mettre fin à l'acteur sur le serveur?Les Scala Remote Actors arrêtent le client de se terminer

Je ne veux pas encore utiliser un modèle "un acteur par client".

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) 
    } 
} 

mon client serait alors ressembler à ceci

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 
+0

Voir http://stackoverflow.com/questions/3795863/how-to-terminate-scala-remote-actor-client –

Répondre

0

Je suggère de placer le code côté client en un acteur lui-même - à-dire de ne pas appeler en vie/s'inscrire dans le thread principal

(sous-entendu par http://www.scala-lang.org/api/current/scala/actors/remote/RemoteActor$.html)

quelque chose comme

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

Ou similaire (désolé, je ne suis pas en utilisant 2.8 donc peut-être quelque chose de mal - n'hésitez pas à modifier si vous le faites réellement travailler pour vous!).

+0

hmm .. markdown n'aime vraiment pas le guillemet simple comme symbole de chose ... devrais-je le changer pour utiliser autre chose? –

+0

qui ne fonctionnera pas, car le registre est ServerOnly, et je ne veux pas que le serveur doive se connecter aux clients – Arne

Questions connexes