シンプルなサーバー/クライアントakka(Akka 2.0.3を使用)アプリケーションをセットアップしようとしていますが、接続できませんでした。基本的なコードは次のとおりです。シンプルなリモートAkkaアプリケーションの実行を取得する
import com.typesafe.config.ConfigFactory
import akka.actor.Actor
import akka.actor.ActorSystem
import akka.actor.Props
class Server extends Actor {
def receive = {
case s: String => println("Got " + s)
}
}
val serverSystem = ActorSystem("server", ConfigFactory.load(ConfigFactory.parseString("""
akka {
actor {
provider = "akka.remote.RemoteActorRefProvider"
}
remote {
transport = "akka.remote.netty.NettyRemoteTransport"
netty {
hostname = "localhost"
port = 5678
}
}
}
""")))
val server = serverSystem.actorOf(Props[Server], name = "server")
Thread.sleep(500)
println("started")
Thread.sleep(500)
val clientSystem = ActorSystem("client", ConfigFactory.load(ConfigFactory.parseString("""
akka {
actor {
provider = "akka.remote.RemoteActorRefProvider"
}
}
""")))
val remoteServer = clientSystem.actorFor("akka://[email protected]:5678/user/server")
remoteServer ! "HEY"
Thread.sleep(3000)
clientSystem.shutdown
serverSystem.shutdown
この設定は外部ファイルに置く必要があります。
あなたはlocalhost
でXXX
を交換した場合、それは動作します:
started
Got HEY
しかし、私が到着したことはありませんXXX
HEY
メッセージのための私の外部(解決)IP(ホームルータの背後にあるPC)を使用した場合。私はそれがいくつかのファイアウォールの問題のためだと思って、私のルーターで関連するTCPとUDPポートを転送し、またWindowsのファイアウォールでそれらを開いたり/許可したりしました。その後、次のコードが機能しました(XXX
も私の外部IPに置き換えられました)。開始ServerTest
はClientTest
で接続することができます。
import java.net.ServerSocket
object ServerTest extends App {
println("START server")
val ss = new ServerSocket(5678)
val s = ss.accept()
println(s)
println("END")
}
import java.net.Socket
object ClientTest extends App {
println("START client")
val s = new Socket("XXX", 5678)
println(s)
println("END")
}
のでit'sないポート/ファイアウォールの問題を、それをisn't!だから問題はどこにあるの?
Akka RemotingはファイアウォールやNATを扱っていません:http://akka.io/faq/ –
@Viktor私の質問に答えることができますが、私はまだソケットのバージョンが可能で、なぜakkaではないのか疑問です。 –
@Viktor私はそれを受け入れることができるように答えとしてあなたのコメントを投稿してもよろしいですか? –