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!"
    }
}

予想どおり、サーバーは「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 に答える