获取简单的远程Akka应用程序运行

Pet*_*itz 6 scala akka

我试图建立一个简单的服务器/客户端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
Run Code Online (Sandbox Code Playgroud)

我知道配置应该放在外部文件中.
如果XXXlocalhost它替换它的工作原理:

started
Got HEY
Run Code Online (Sandbox Code Playgroud)

但是,如果我用我的外部(解析)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")
}
Run Code Online (Sandbox Code Playgroud)

所以这不是端口/防火墙问题,不是吗?!那么问题出在哪里?

ron*_*ron 1

localhost通常意味着127.0.0.1,它只是计算机中可能存在的众多接口(卡)之一。绑定到 localhost 的服务器不会接收连接到其他接口(包括具有外部地址的接口)的连接。

您应该指定服务器中的外部地址,或者0.0.0.0这意味着“绑定到所有接口”。