0

使用作为 Akka.NET 源代码的一部分提供的示例聊天服务器/客户端项目,我尝试对其进行修改,使其能够在我的网络上的两台计算机上成功运行。

我有两个系统通过这样的路由器连接

192.168.0.29 (Server) <---------------| Router |---------------> 192.168.0.52 (Client)

然后我有两个配置如下的演员系统:

服务器:

akka {  
    actor {
        provider = remote #Specify remote provider
    }
    remote {

        dot-netty.tcp {
            port = 666 #Akka server port number
            hostname = 0.0.0.0 #Bind to all local network interfaces
            public-hostname = 192.168.0.29 #Expose public IP to enable correct routing of public messages.

        }
    }
}

客户:

akka {  
    actor {
        provider = remote
    }
    remote {
        dot-netty.tcp {
            port = 0 #Tell Akka that this is a client connection/use random port.
            hostname = 192.168.0.29 #Tell Akka.NET which remote instance to connect to
        }
    }
}

不幸的是,虽然我能够在本地成功连接到聊天服务器,但无论我如何配置 Hocon,我似乎都无法让远程实例绑定到位于机器上的服务器 actor 192.168.0.29

我收到的具体错误消息

[ERROR][27/11/2019 4:58:36 PM][Thread 0004][Akka.Remote.Transport.DotNetty.TcpTransport] Failed to bind to 192.168.0.29:0; shutting down DotNetty transport.
Cause: System.Net.Sockets.SocketException (10049): The requested address is not valid in its context
   at System.Net.Sockets.Socket.UpdateStatusAfterSocketErrorAndThrowException(SocketError error, String callerName)

此错误消息向我表明 Akka.NET 没有可用的套接字可以访问。

具有讽刺意味的是,前段时间我问了一个非常相似的问题,当时它帮助我解决了连接问题,但直到最近我才再次使用 Akka.NET。

我注意到两台机器的防火墙都关闭了,并且可以成功地相互 ping,我还尝试了各种设置组合。

Akka.NET 服务器/客户端应用程序的原始源代码位于此处,我当前的版本位于此处

谁能提供任何关于我可能做错了什么以及如何改进我对 Akka.NET 远程连接的调试的见解?例如,有没有一种方法可以验证服务器上的 Actor 系统192.168.0.29是否可以从192.168.0.52外部访问?

4

1 回答 1

0

哈哈,在发布我的问题 5 分钟后,我终于能够确定解决方案(尽管它并不理想)。

解决方案是意识到,当您ActorSystem在客户端应用程序上实例化时,您实际上并没有将本地参与者系统连接到远程系统,而是创建了一个参与者系统的本地实例,该实例本身正在侦听随机端口。

远程连接本身在您创建ActorSelection()引用时发生。

所以我需要做的就是改变我的客户 hocon

hostname = 192.168.0.29

hostname = 192.168.0.52

然而,这会产生一个最终(尽管相当小)的问题。我现在需要一个不同的 hocon 文件用于本地运行的实例和远程运行的实例。诚然,这可能可以通过代码解决......

我很乐意将可能能够提出解决此问题的方案的人标记为解决方案。

于 2019-11-27T17:33:54.150 回答