2012-09-22 5 views
6

シンプルなサーバー/クライアント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 

この設定は外部ファイルに置く必要があります。
あなたはlocalhostXXXを交換した場合、それは動作します:

started 
Got HEY 

しかし、私が到着したことはありませんXXXHEYメッセージのための私の外部(解決)IP(ホームルータの背後にあるPC)を使用した場合。私はそれがいくつかのファイアウォールの問題のためだと思って、私のルーターで関連するTCPとUDPポートを転送し、またWindowsのファイアウォールでそれらを開いたり/許可したりしました。その後、次のコードが機能しました(XXXも私の外部IPに置き換えられました)。開始ServerTestClientTestで接続することができます。

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!だから問題はどこにあるの?

+1

Akka RemotingはファイアウォールやNATを扱っていません:http://akka.io/faq/ –

+0

@Viktor私の質問に答えることができますが、私はまだソケットのバージョンが可能で、なぜakkaではないのか疑問です。 –

+0

@Viktor私はそれを受け入れることができるように答えとしてあなたのコメントを投稿してもよろしいですか? –

答えて

1

localhostは通常、コンピュータ内の多分多くのインタフェース(カード)の1つである127.0.0.1を意味します。 localhostへのサーババインディングは、他のインタフェース(外部アドレスを含むインタフェースを含む)に接続する接続を受け取りません。

サーバーに外部アドレスを指定するか、または「すべてのインターフェイスにバインドする」という0.0.0.0を指定する必要があります。

+1

サーバーを外部アドレスにバインドすると、「スレッドの例外」メイン「org.jboss.netty.channel.ChannelException:バインドに失敗しました:/84.187.XXX.XXX:5678」で失敗します。 'HEY'メッセージをバインドしますが、HEYメッセージは受信しません。 '192.168.2.101'と同じです。ルータに接続されている私のLANインタフェース(カード)のIPアドレスです。それでは、どんな新しい考えですか?ところで、 –

+0

'ServerSocket [addr = 0.0.0.0/0.0.0.0、port = 0、localport = 5678]'を生成する 'println(new ServerSocket(5678))'と比べて、 '0.0.0.0'が意味を持ちます。 –

関連する問題