6

シンプルなサーバー/クライアント akka (Akka 2.0.3 を使用) アプリケーションをセットアップしようとしていますが、接続に失敗しました。事前に基本的なコードは次のとおりです。

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://server@XXX:5678/user/server")

remoteServer ! "HEY"

Thread.sleep(3000)
clientSystem.shutdown
serverSystem.shutdown

構成は外部ファイルに配置する必要があることを知っています。
置き換えるXXXとうまくいきますlocalhost

started
Got HEY

しかし、メッセージに外部 (解決済み) IP (ホーム ルーターの背後にある PC) を使用するとXXXHEYメッセージが届きません。ファイアウォールの問題が原因であると考え、関連する 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")
}

つまり、ポート/ファイアウォールの問題ではありませんよね?! では、どこに問題があるのですか?

4

1 に答える 1

1

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

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

于 2012-09-22T12:54:40.550 に答える