【发布时间】:2013-04-12 05:23:31
【问题描述】:
我有一个在 Android 设备上运行的 Akka 系统,它通过 Akka Remoting 与服务器上的 Akka 系统通信。
Android 设备可能会获取任何 IP 地址,IP 可能会在应用程序运行时更改,并且 IP 可能无法从服务器访问。因此,我在 Android 设备上使用 akka.remote.netty.hostname = "0.0.0.0" 和 akka.remote.netty.port = 8000 配置了 Akka。
Android Akka 系统在服务器上获取一个 Actor 的引用,向它发送消息,服务器上的 Actor 记录 sender() actorRef 并不断向它发送消息。当服务器和 Android 设备在同一个 wlan 上,并且它们通过互联网通过 GPRS 通话时,此方法有效。
现在我正在仔细研究连接丢失和重新连接。我一直关注的场景是这样的:
- Android 设备和服务器都在一个 wlan 上。
- Android 设备向服务器发送消息。
- Android 上的 Akka 远程处理产生
RemoteClientStarted。 - 服务器上的 Akka 远程处理产生
RemoteClientStarted和RemoteServerClientConnected。 - 然后我关闭Android上的无线局域网,等待几秒钟再打开。在这期间不会尝试向服务器发送任何消息。
- 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 时,如何让服务器重用来自 Android 设备的最后传入连接 (
PassiveRemoteClient)? - 如何指示服务器不要尝试连接回客户端?
版本:
- Android:15 (4.0.3)
- 阿卡:2.1
- Java:1.6 64 位
- 斯卡拉:2.10.1
- 网络:3.5.8
【问题讨论】:
标签: android networking client-server netty akka