2010-11-12 131 views
2

我在寫一個簡單的聊天服務器,我想盡可能保持簡單。下面列出的我的服務器只接收連接並將它們存儲在客戶端設置中。傳入的消息然後廣播給該服務器上的所有客戶端。服務器沒有問題,但在客戶端,RemoteActor停止我的程序終止。有沒有辦法刪除我的客戶端上的Actor而不終止服務器上的Actor?Scala Remote Actors停止客戶端

我不想使用「每個客戶端一個演員」模型。

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

請參閱http://stackoverflow.com/questions/3795863/how-to-terminate-scala-remote-actor-client – 2010-11-15 00:20:25

回答

0

我建議把客戶端代碼到演員本身 - 即不是要求活着/註冊在主線程

(暗示通過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,所以可能會弄亂一些東西 - 如果你真的爲你工作,隨意編輯!)。

+0

嗯..降價真的不喜歡單引號作爲符號的事情......我應該改變它使用別的東西? – 2010-11-14 04:08:41

+0

,這將無法正常工作,因爲註冊是ServerOnly,我不希望服務器必須連接到客戶端 – Arne 2010-11-14 16:02:13