我正在和远程演员一起玩,但我遇到了一些困难。
考虑这个服务器:
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!"
}
}
正如所料,服务器打印“嘿!”。
然而,出乎意料的是,客户端应用程序永远不会终止!
看起来很多线程已经在客户端应用程序上启动了,但是在我的main函数完成后它们继续运行!
如何终止客户端应用程序?还有更多:如果我希望我的客户能够启动和停止连接怎么办?我怎样才能做到这一点?
一些额外的信息(基于回复):我正在使用scala 2.8.0.final,我在这里谈论的是一个独立的服务器和一个独立的客户端。它们应该像$ scala Server
和$ scala Client
一样启动。我想要发生的是应用程序“客户端”应该完成,但它永远不会发生。
谢谢!
答案 0 :(得分:3)
不要从演员外部向其他演员发送消息。虽然Scala很乐意接受它,但正如你所看到的那样has consequences。这是一个有效的代码:
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!"
}
}
}
答案 1 :(得分:1)
在客户端代码中,将select和相关语句包装在Actor.actor块中,然后在块的末尾调用exit()。看起来你不应该这样做,但这是我发现终止select调用开始的所有线程的唯一方法。
答案 2 :(得分: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
}
}