- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在用 Java 编写基于服务器-客户端架构的游戏。
出于设计原因,我想使用异步调用将客户端操作传递给服务器,并使用异步回调将所述操作的结果传递回客户端。异步调用允许缓冲客户端操作。排队缓冲允许对客户端操作进行简单的、基本上是一个线程的处理。
目前,我的服务器和客户端代码非常对称。他们创建一个注册表,然后导出并绑定(bind)自己。
异步性是通过在 ConcurrentLinkedQueue 中缓冲传入的操作或结果来实现的。实际处理是由定期运行的线程完成的。
但是,当前的架构在客户端受防火墙保护或位于 NAT 之后时不起作用。在这种情况下,服务器根本无法联系到客户端以将结果推送给他们。
此外,在当前的架构中,服务器不知道哪个客户端发送了给定的操作,除非引入了冗余的身份验证层或 session 处理。这允许伪造行为和作弊。
我一直在考虑可能的解决方案,但还没有找到合适的解决方案:
客户端拉取而不是服务器推送。服务器上可能有一种方法,客户端可以定期调用该方法来获取其结果。然而,这种方法看起来很丑陋,它引入了额外的延迟、带宽和时序问题。也不解决 Action 伪造。直接通知也是非常受欢迎的。
TCP 连接本身允许双向通信,并且绝对可以识别客户端,因此 RMI 或 JRemoting 可能被黑客攻击以支持它,但我不知道如何,而且我我不知道有任何现有的解决方案。
消息传递。我不确定消息传递框架是否支持身份验证/ session 或客户端标识。不过,我肯定会丢失远程方法。
我认为正确的解决方案是找到一个支持以上所有内容的远程方法调用框架。
简而言之,我正在寻找一种方法来:
有没有支持这些的远程方法调用框架?哪个最好?
最佳答案
我不知道您为什么坚持使用 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/
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 6年前关闭。 Improve t
我正在尝试部署启用了策略的 Azure 防火墙高级版,并且需要添加网络规则集合负载。 我在参数文件中有规则集合,需要循环遍历每个规则集合并将其添加到策略中。 "FirewallSettings": {
无论如何,我对 symfony 都不陌生,但我一直使用 FOSUserBundle,默认情况下,它会阻止用户使用 2 个不同的登录表单来验证两种不同的用户类型。 我有两个实体,一个是Admins,另一
如果防火墙内的客户端通过 TCP 连接到公共(public)服务器,一旦连接形成,防火墙就允许双向通信。这是我们在日常使用中通常看到的。我的问题是:这也适用于 UDP 吗? 由于UDP没有连接,我将稍
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 9 年前。 Improve
我目前正在为一家公司编写 windows-firewallmanager。 问题是,我只能通过名称而不是 INetFwRule 对象或其他方式删除条目。 有些条目具有两次相同的名称,其中一个用于 TC
我有一个防火墙实现,我想记录在机器上访问过的所有网站。因此,当用户在浏览器(任何浏览器)中输入地址或单击链接时,能够记录访问的地址。 问题是我只想记录访问过的地址,而不是页面请求的其他资源(广告、if
刚好手工装完一台CentOS6.4,就顺便记录一下。 复制代码 代码如下: # sestatus SELinux status:  
我是 Windows 防火墙的新手。我看过这个对话,但无法理解它的含义。 上面的对话框说 “允许 python 在这些网络上通信:” .然后它提供了两个复选框,一个用于每个专用网络,一个用于公共(pu
在我看来,ClickOnce 应用程序无法与 Windows Firewall 顺利运行。 . 我已经成功使用 ClickOnce 部署两年了。现在企业已升级到Windows 7,这遇到了障碍。每个用
我的 C# 应用程序使用端口 777 进行异步通信,使用端口 3306 与 My Sql Server 进行通信。当端口被防火墙阻止时,就会出现问题。我试图创建一个程序来在 Windows 7 的防火
我正在开始研究智能防火墙,但在此之前,我需要清楚地了解非常基本的防火墙如何工作。由于我和我的团队最擅长 C 语言,我们将使用它。 有人可以举一个用 C 语言编写的非常基本的防火墙的例子吗? 最佳答案
我正在尝试以编程方式创建出站 Windows 防火墙规则。此外,我想以编程方式启用和禁用此规则。我怎样才能在 C# 中执行此操作?手动,我可以通过进入控制面板,单击 Windows 防火墙,然后单击高
有人用过android intent firewall吗? http://www.cis.syr.edu/~wedu/android/IntentFirewall/ 我用 genymotion 模拟器
我编写了一个简单的 Java 应用程序,它使用套接字与自身的多个实例进行交互。第一个实例自动承担服务器的角色,监听特定端口,所有后续实例都连接到它。 我遇到的问题是 Windows 防火墙弹出询问我是
我有一个通过 ClickOnce 安装和更新的应用程序。该应用程序通过FTP下载文件,因此需要添加为windows防火墙的异常(exception)。由于 ClickOnce 的工作方式,EXE 的路
我很难在 C++ 中找到与 Windows 防火墙相关的任何内容(关于如何将应用程序添加到除列表之外、关闭端口或禁用对某些应用程序的 Internet 访问)。我发现甚至 MS 网站都显示了 Visu
我有一些使用 docker-compose up 运行的项目。该项目在端口 4200、后端 3000 和 db 5342 上有前端。当我使用 docker-compose 运行它时,所有这些端口都是公
用python编写的程序,它选择可用于TCP和UDP通信的随机端口。如果我通过运行 sudo ufw enable 启用 Linux 防火墙(ufw) .我们可以通过给出允许任何端口 sudo ufw
使用命令提示符修改 Windows 防火墙 我可以允许域/公共(public)/私有(private)复选标记全部出现在同一行中吗(就像我可以手动单击一样)? 到目前为止,我有 3 个条目,每种类型有
我是一名优秀的程序员,十分优秀!