クライアントがインターネット経由でサーバーと通信できるAkkaプログラムに対してポート転送を実行しようとしています。私はルータを設定して、ポート転送メカニズムは動作していますが、Akkaに問題があるようです。Akkaポート転送
問題は、クライアントがリモートアクターをサーバーから取得できないことです。それは受信側が異なるサーバー側でエラーを出し続けます。クライアントは"akka.tcp://[email protected]:5150/user/remote"
によってリモートアクターを取得しています。ここでは67.18.67.18
が私のグローバルIPアドレスです。次に、リモートアクターは"akka.tcp://[email protected]:5150/user/remote"
のパスでリモーティングします。ここで、192.168.0.106
はサーバーのローカルIPです。私は、クライアントが同じパスを使用してリモートアクターにアクセスする必要があることを知っていますが、public-localname
を定義しても、サーバーはグローバルIPをローカルIPに変換したり、グローバルIP経由でアクセスを許可しません。回避策はありますか?以下はサーバーのapplication.conf
です。
akka {
loglevel = "INFO"
actor {
provider = "akka.remote.RemoteActorRefProvider"
}
remote {
enabled-transports = ["akka.remote.netty.tcp"]
netty.tcp {
hostname = ""
port = 5150
public-hostname = "67.18.67.18"
}
log-sent-messages = on
log-received-messages = on
}
}
私はそのドキュメントを紛失しました。私は前にどこかでそれを見たことを覚えています。私は、public-hostnameが正しいメカニズムであることを確信しています。ありがとうbtw。 – Ginsan
ところで、あなたはconf内のローカルアドレスを取得する方法を知っていますか?私はhostname = ""が自動的にInetAddress.getLocalHost.getHostAddressを使用することを知っています。しかし、bind-hostnameの場合は動作しません。私はbind-hostname = "InetAddress.getLocalHost.getHostAddress"を試しても動作しません。私は本当にconfのアドレスを明示的に定義したくありません。ありがとうございました。 – Ginsan
オプションのシステムプロパティオーバーライドを使用して設定ファイルにデフォルト値を指定し、起動時にその値をシステムプロパティとして設定します。https://github.com/typesafehub/config#optional-system-or-env-variable-overrides –