Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Akka远程处理是否支持单向连接?_Android_Networking_Client Server_Netty_Akka - Fatal编程技术网

Android Akka远程处理是否支持单向连接?

Android Akka远程处理是否支持单向连接?,android,networking,client-server,netty,akka,Android,Networking,Client Server,Netty,Akka,我有一个运行在Android设备上的Akka系统,它通过Akka远程处理与服务器上的Akka系统进行通信 Android设备可能会获得任何IP地址,在应用程序运行时IP可能会更改,并且无法从服务器访问IP。因此,我在Android设备上配置了Akka,使用Akka.remote.netty.hostname=“0.0.0.0”和Akka.remote.netty.port=8000 Android Akka系统获取对服务器上某个参与者的引用,向其发送消息,服务器上的参与者记录sender()ac

我有一个运行在Android设备上的Akka系统,它通过Akka远程处理与服务器上的Akka系统进行通信

Android设备可能会获得任何IP地址,在应用程序运行时IP可能会更改,并且无法从服务器访问IP。因此,我在Android设备上配置了Akka,使用
Akka.remote.netty.hostname=“0.0.0.0”
Akka.remote.netty.port=8000

Android Akka系统获取对服务器上某个参与者的引用,向其发送消息,服务器上的参与者记录sender()actorRef并不断向其发送消息。当服务器和安卓设备都在同一个wlan上,并且通过GPRS在互联网上通话时,这一功能就可以发挥作用

现在,我将更仔细地了解连接丢失和重新连接。我一直关注的场景是:

  • Android设备和服务器都位于wlan上
  • Android设备向服务器发送消息
  • Android上的Akka远程处理产生
    RemoteClientStarted
  • 服务器上的Akka远程处理产生
    RemoteClientStarted
    RemoteServerClientConnected
  • 然后我关掉Android上的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事件

现在问题是:

  • 在这种情况下,当发送消息时,如何使服务器重用来自Android设备的最后一个传入连接(
    被动远程客户端
  • 如何指示服务器永远不要尝试连接回客户端?
  • 版本:

    • Android:15(4.0.3)
    • 阿克卡:2.1
    • Java:1.6 64位
    • Scala:2.10.1
    • 内蒂:3.5.8

    这可能不是您一直希望的答案,但现在它来了(我是Akka技术负责人)

    Akka remoting设计用于在充当对等点的系统之间工作。开发背后的驱动力是构建集群支持,该支持从2.1版开始出现,并将从2.2版开始得到正式支持和进一步开发。这有几个重要的后果:

    • ActorRefs
      应该是位置透明的,这意味着无论您在哪里使用它们,它们的工作原理都是相同的,因此每个节点都需要能够连接到给定参考点所在的节点
    • Akka节点之间的通信基本上是对称的,即使您对它的使用可能不是对称的
    • 传递
      ActorRef
      作为进行对话的手段,意味着通过引用指向的实体需要保持可用,否则通信将失败;保持可用意味着“在引用指向的相同位置”
    对于您的场景来说,这意味着您最好不要使用普通远程处理来耦合您的参与者系统,而是使用其他支持您遭受的短期关联的方法。例如,您可以将服务器公开为REST服务,或者您可以只使用裸TCP(甚至UDP)使用Akka IO层。在服务器端处理端点的参与者中,您可以识别同一个客户端是否从不同的网络位置与您交谈、缓冲回复消息、将外部参与者伪装在本地代理参与者后面等。使用此方案,您甚至可以在不可靠的通道上构建可靠的消息传递(使用ACKing)的好处在于,在服务器(可能是集群)中,所有通信都可以正常工作,因为如何与客户机通信的问题部分被封装在一个位置


    长话短说:您的用例不是一个由简单的Akka即时远程处理支持的用例。

    感谢您的全面回答,特别是关于如何使其工作的建议。快速跟进:
    RemoteTransport
    似乎是在Akka下实现自己远程处理的基础。它没有文档记录,所以我不得不问:这是推荐方式?在即将发布的Akka版本中,该机制是否会发生重大变化?RemoteTransport将在2.2版本中发生变化,虽然可以想象特殊应用程序会创建自己的应用程序,但我们不希望经常发生这种情况。有许多与参与者消息相关的假设可能与您的需求不符。好吧,我想我会继续y来自
    RemoteTransport
    然后。出于好奇:我最终测试了akka zeromq。它是根据zeromq-2.1构建的,这对我来说是不可接受的。所以我测试了jeromq,它应该是zeromq3的纯java端口。不幸的是,这并不能替代t