我有一个在 Android 设备上运行的 Akka 系统,它通过 Akka Remoting 与服务器上的 Akka 系统通信。
Android 设备可能会获得任何 IP 地址,IP 可能会在应用程序运行时更改,并且 IP 可能无法从服务器访问。因此,我在 Android 设备上使用akka.remote.netty.hostname = "0.0.0.0"
和配置了 Akka akka.remote.netty.port = 8000
。
Android Akka 系统获取到服务器上的一个 Actor 的引用,向它发送消息,服务器上的 Actor 记录 sender() actorRef 并不断向它发送消息。当服务器和 Android 设备都在同一个 wlan 上时,并且当它们通过互联网通过 GPRS 通话时,此方法有效。
现在我正在仔细研究连接丢失和重新连接。我一直关注的场景是这样的:
- Android 设备和服务器都在一个 wlan 上。
- Android 设备向服务器发送消息。
- Android 上的 Akka 远程处理产生
RemoteClientStarted
. - 服务器上的 Akka 远程处理产生
RemoteClientStarted
和RemoteServerClientConnected
. - 然后我关掉安卓上的wlan,等几秒再打开。在这期间不会尝试向服务器发送任何消息。
- Android 上的 Akka 远程处理产生
RemoteClientShutdown
和RemoteClientError
(ETIMEDOUT) - 服务器上的 Akka 远程处理什么也没说。
- Android 向服务器发送消息。
- 服务器产生
RemoteServerClientConnected
并接收消息。 - 服务器尝试向Android 发送一条消息(以下问题称为A
RemoteServerError
),并产生: ,RemoteServerClientDisconnected
,RemoteClientShutdown
,RemoteServerClientClosed
。 - Android 永远不会从服务器获取消息。
- 服务器尝试发送另一条消息,但 Akkas
RemoteClient
说:- [PassiveRemoteClient@akka://xxx@0.0.0.0:8000] 已关闭
- 启动到 [akka://xxx@0.0.0.0:8000|/0.0.0.0] 的远程客户端连接
- RemoteClientError@akka://vts@0.0.0.0:8000: 错误[...
最后一个错误似乎来自 Akka Remote 想要创建一个新ActiveRemoteClient
的而不是重用现有的PassiveRemoteClient
. 我猜这又是因为服务器在看到错误/断开连接/关闭/客户端关闭之前观察了 RemoteServerClientConnected 事件。
现在的问题:
- 在这种情况下发送消息 A 时,如何让服务器重用
PassiveRemoteClient
来自 Android 设备的最后一个传入连接 ( )? - 如何指示服务器不要尝试连接回客户端?
版本:
- 安卓:15(4.0.3)
- 阿卡:2.1
- Java:1.6 64位
- 斯卡拉:2.10.1
- 网:3.5.8