gpt4 book ai didi

java - 通过防火墙或 NAT 进行双向异步调用和回调的 RMI 替代方案

转载 作者:搜寻专家 更新时间:2023-11-01 02:28:39 25 4
gpt4 key购买 nike

我正在用 Java 编写基于服务器-客户端架构的游戏。

出于设计原因,我想使用异步调用将客户端操作传递给服务器,并使用异步回调将所述操作的结果传递回客户端。异步调用允许缓冲客户端操作。排队缓冲允许对客户端操作进行简单的、基本上是一个线程的处理。

目前,我的服务器和客户端代码非常对称。他们创建一个注册表,然后导出并绑定(bind)自己。

异步性是通过在 ConcurrentLinkedQueue 中缓冲传入的操作或结果来实现的。实际处理是由定期运行的线程完成的。

但是,当前的架构在客户端受防火墙保护或位于 NAT 之后时不起作用。在这种情况下,服务器根本无法联系到客户端以将结果推送给他们。

此外,在当前的架构中,服务器不知道哪个客户端发送了给定的操作,除非引入了冗余的身份验证层或 session 处理。这允许伪造行为和作弊。


我一直在考虑可能的解决方案,但还没有找到合适的解决方案:

  • 客户端拉取而不是服务器推送。服务器上可能有一种方法,客户端可以定期调用该方法来获取其结果。然而,这种方法看起来很丑陋,它引入了额外的延迟、带宽和时序问题。也不解决 Action 伪造。直接通知也是非常受欢迎的。

  • TCP 连接本身允许双向通信,并且绝对可以识别客户端,因此 RMI 或 JRemoting 可能被黑客攻击以支持它,但我不知道如何,而且我我不知道有任何现有的解决方案。

  • 消息传递。我不确定消息传递框架是否支持身份验证/ session 或客户端标识。不过,我肯定会丢失远程方法。

  • 我认为正确的解决方案是找到一个支持以上所有内容的远程方法调用框架。


简而言之,我正在寻找一种方法来:

  • 异步调用服务器或向其传递消息
  • 异步调用客户端或向其传递消息,即使在防火墙或 NAT 之后也是如此
  • 识别发送 Action 的客户端
  • 最好能够调用方法,而不仅仅是传递消息
  • 保持使用 JUnit 和 Mockito 轻松测试它的能力(每台机器多个客户端)

有没有支持这些的远程方法调用框架?哪个最好?

最佳答案

我不知道您为什么坚持使用 RMI 或类似的东西,因为根据定义,它是单向的。但是我必须学习类似的类(class)......对于其中一个 my client-server systems ,我使用 RMI 和长轮询实现了与您现在拥有的类似的东西。结果是一团糟,而且越来越糟。

然后我发现了publish-subscribe的精彩世界构架。这些是构建客户端-服务器应用程序的自然方式,无需实现大量您自己的管道。此外,这些框架支持诸如自动保活、时间同步、 session 身份验证和权限之类的功能,以及您不想自己实现的大量其他功能。

对于我的项目,我撕掉了我自己的所有工作并将其替换为 CometD ,它同时支持 Java 和浏览器 (Javascript) 客户端,非常高兴。它肯定会支持您的所有需求 - 一旦建立连接,从任何一方发起的异步通信、客户端识别(和许多其他功能)以及 NAT 后面的客户端都不是问题。编写测试也很容易,整个框架已经扩展到能够处理 10 万个客户端,这对于 RMI 来说是不可能的。

我强烈建议您考虑放弃能够远程调用方法的要求。方法本质上是片面的,但它们仍然需要调用和返回。使用 event-driven programming 设计您的系统要好得多.

更新:我已经转向网络应用程序的世界,特别是使用 Meteor .

关于java - 通过防火墙或 NAT 进行双向异步调用和回调的 RMI 替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15048465/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com