4

我正在玩远程演员,但我遇到了一些困难。

考虑这个服务器:

object Server {
    def main(args: Array[String]) {
        val server = new Server
        server.start
    }
}

class Server extends Actor {
    RemoteActor.alive(12345)
    RemoteActor.register('server, this)

    def act() {
        while(true) {
            receive { case x => println(x) }
        }
    }
}

我写了一个简单的客户端:

object Client {
    def main(args: Array[String]) {
        val server = RemoteActor.select(Node("localhost", 12345), 'server)
        server ! "Hey!"
    }
}

正如预期的那样,服务器打印“嘿!”。

然而,出乎意料的是,客户端应用程序永远不会终止!

看起来客户端应用程序上已经启动了许多线程,但是在我的主函数完成后它们继续运行!

我可以做些什么来终止客户端应用程序?还有更多:如果我希望我的客户端能够启动和停止连接怎么办?我怎样才能做到这一点?

一些附加信息(基于回复):我使用的是 scala 2.8.0.final,我在这里谈论的是独立服务器和独立客户端。它们应该像$ scala Server和一样启动$ scala Client。我想要发生的是应用程序“客户端”应该完成,但它永远不会发生。

谢谢!

4

3 回答 3

3

不要从演员之外向其他演员发送消息。虽然 Scala 很乐意接受它,但它会产生如您所见的后果。这是一个等效的代码:

import scala.actors.remote._

object Act extends scala.actors.Actor {
  def act = {
        val server = RemoteActor.select(Node("localhost", 12345), 'server)
        server ! "Hey!"
  }
}

object Client {
    def main(args: Array[String]) {
      Act.start()
    }
}

或者,更简单地说,

import scala.actors.Actor.actor
import scala.actors.remote._

object Client {
    def main(args: Array[String]) {
      actor {
        val server = RemoteActor.select(Node("localhost", 12345), 'server)
        server ! "Hey!"
      }        
    }
}
于 2010-09-29T12:13:32.563 回答
1

在客户端代码中,将 select 和相关语句包装在 Actor.actor 块中,然后在块的末尾调用 exit()。您似乎不需要这样做,但这是我发现终止 select 调用启动的所有线程的唯一方法。

于 2010-09-29T00:29:36.893 回答
0

以下代码适用于我:

import scala.actors.Actor
import scala.actors.remote.RemoteActor
import scala.actors.remote.RemoteActor._
import scala.actors.remote.Node

object Client {
    def main(args: Array[String]) {
        val server = RemoteActor.select(Node("localhost", 12345), 'server)
        server ! "Hey!"
        exit
    }
}
于 2010-09-27T16:18:31.627 回答