我正在编写一个简单的聊天服务器,我希望尽可能简单。下面列出的我的服务器只接收连接并将它们存储在客户端集中。然后,将传入的消息广播到该服务器上的所有客户端。服务器没有问题,但在客户端,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
答案 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,所以可能搞砸了一些东西 - 如果你让它真的适合你,可以随意编辑!)。