1

我的 akka 项目有一个奇怪的行为。总结一下:我有两个 Actorsystems 在我的主机系统上运行,并且想要从一个连接到另一个以发送消息。现在的问题是,当我在客户端上使用以下 akka 配置时:

akka {
  actor {
    provider = remote
  }
  remote {
    enabled-transports = ["akka.remote.netty.tcp"]
    netty.tcp {
      hostname = "127.0.0.1"
      port = 0
    }
 }
}

以及我的服务器actorsystem上的以下内容:

akka {
  loglevel = "INFO"
  actor {
    provider = "akka.remote.RemoteActorRefProvider"
  }
  remote {
    enabled-transports = ["akka.remote.netty.tcp"]
    netty.tcp {
      hostname = "127.0.0.1"
      port = 5150
    }
    log-sent-messages = on
    log-received-messages = on
  }
}

我无法使用actorselection 连接到我的服务器actorsystem,如下所示:

val selection = context.actorSelection("akka.tcp://ServerSystem@0.0.0.0:5150/user/receiver")

我希望它可以使用通配符 IP 地址,因为这意味着它试图连接到主机系统拥有的每个 IPv4。我收到以下错误:

[WARN] [05/06/2019 08:57:03.738] [New I/O boss #3] [NettyTransport(akka://ClientSystem)] Remote connection to [null] failed with java.net.ConnectException: Connection refused: no further information: /0.0.0.0:5150
[WARN] [05/06/2019 08:57:03.738] [ClientSystem-akka.remote.default-remote-dispatcher-13] [akka.tcp://ClientSystem@127.0.0.1:8346/system/endpointManager/reliableEndpointWriter-akka.tcp%3A%2F%2FServerSystem%400.0.0.0%3A5150-0] Association with remote system [akka.tcp://ServerSystem@0.0.0.0:5150] has failed, address is now gated for [5000] ms. Reason: [Association failed with [akka.tcp://ServerSystem@0.0.0.0:5150]] Caused by: [java.net.ConnectException: Connection refused: no further information: /0.0.0.0:5150]

另一方面,如果我将服务器配置上的 127.0.0.1 更改为 0.0.0.0 当我在 docker 容器中运行它并使用客户端上的演员选择中的 0.0.0.0 地址连接到它时,它工作得很好,这正在主机上运行。所以在这里它似乎可以绑定和连接到通配符 IP。

有人对这种行为有解释吗?

4

1 回答 1

1

我认为这是由这个superuser.com answer解释的。

127.0.0.1是一个私有环回网络,只能用于连接同一台计算机上的其他进程。因此,如果您将接收套接字绑定到该地址,您将无法接收来自其他计算机的连接。

0.0.0.0是一个伪地址,根据上下文具有不同的含义。对于服务器,这意味着套接字可从任何网络上的任何传入 IP 地址获得。对于客户端,它可能意味着当前机器的默认 IP 地址,但这取决于库选择如何处理它。

于 2019-05-06T07:16:51.750 回答