我正在尝试设置一个简单的服务器/客户端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)XXX
,HEY
消息永远不会到达。我认为这是由于一些防火墙问题,并在我的路由器转发相关的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")
}
所以这不是端口/防火墙问题,不是吗?!那么问题出在哪里???
答案 0 :(得分:1)
localhost
通常表示127.0.0.1
,它只是计算机中可能的许多接口(卡)中的一个。绑定到localhost的服务器不会接收连接到其他接口的连接(包括具有外部地址的接口)。
您应该在服务器中指定外部地址,或0.0.0.0
表示“绑定到所有接口”。