Get Simple Remote Akka Application Running

2020-02-28 23:53发布

问题:

I am trying to set up a simple server/client akka (using Akka 2.0.3) application, but it failed to connect. Beforehand here is the basic code:

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

I know that the configurations should be placed in external files.
If you replace XXX with localhost it works:

started
Got HEY

But if I used my external (resolved) IP (PC behind home router) for XXX the HEY message never arrives. I thought it is due to some firewall problem and forwarded the related TCP and UDP ports at my router and also opened/allowed them at my Windows firewall. So after that the following code worked (also XXX replaced with my external IP). A started ServerTest can be connected by a 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")
}

So it´s not a port/firewall problem, isn´t it?! So where is the problem???

回答1:

localhost usually means 127.0.0.1, which is only one of the possibly many interfaces (cards) in a computer. The server binding to localhost won't receive connections connecting to the other interfaces (including the one with the external address).

You should either specify the external address in the server, or 0.0.0.0 which means "bind to all interfaces".



标签: scala akka