我正在使用Java编写基于服务器-客户端架构的游戏。
出于设计原因,我想使用异步调用将客户端操作传递到服务器,并使用异步回调将操作结果传递回客户端。异步调用允许缓冲客户端操作。排队缓冲允许对客户端操作进行简单的、基本上是单线程的处理。
目前,我的服务器和客户端代码非常对称。它们创建一个注册表,然后导出并绑定自己。
通过将传入的操作或结果缓冲在ConcurrentLinkedQueue中来实现异步性。实际处理由定期运行的线程完成。
然而,在客户端被防火墙或NAT封锁时,这种当前架构无法工作。在这种情况下,服务器根本无法联系客户端以向其推送结果。
此外,在这种当前架构中,服务器不知道哪个客户端发送了给定的操作,除非引入冗余的身份验证或会话处理层。这允许伪造操作和作弊。
我一直在思考可能的解决方案,但没有找到合适的方案:
1. 客户端拉取而不是服务器推送。服务器上可能有一个方法,客户端定期调用该方法获取其结果。然而,这种方法似乎非常丑陋,它引入了额外的延迟、带宽和时间问题。也无法解决操作伪造问题。直接通知也是非常理想的。
2. TCP连接本身允许双向通信,并且可以明确识别客户端,因此RMI或JRemoting可能被黑客攻击以支持它,但我不知道如何做,也不知道是否存在任何现有的解决方案。
3. 消息传递。我不确定消息传递框架是否支持身份验证/会话或客户端识别。我肯定会失去远程方法。
4. 我相信正确的解决方案是找到一个远程方法调用框架,支持上述所有内容。
总之,我正在寻找一种方式:
- 异步调用服务器或将消息传递给它 - 异步调用客户端或将消息传递给它,即使在防火墙或NAT后面 - 识别发送操作的客户端 - 最好能够调用方法,而不仅仅是传递消息 - 保持使用JUnit和Mockito轻松测试(每台机器多个客户端)的能力
是否有支持这些功能的远程方法调用框架?哪个是最好的?
出于设计原因,我想使用异步调用将客户端操作传递到服务器,并使用异步回调将操作结果传递回客户端。异步调用允许缓冲客户端操作。排队缓冲允许对客户端操作进行简单的、基本上是单线程的处理。
目前,我的服务器和客户端代码非常对称。它们创建一个注册表,然后导出并绑定自己。
通过将传入的操作或结果缓冲在ConcurrentLinkedQueue中来实现异步性。实际处理由定期运行的线程完成。
然而,在客户端被防火墙或NAT封锁时,这种当前架构无法工作。在这种情况下,服务器根本无法联系客户端以向其推送结果。
此外,在这种当前架构中,服务器不知道哪个客户端发送了给定的操作,除非引入冗余的身份验证或会话处理层。这允许伪造操作和作弊。
我一直在思考可能的解决方案,但没有找到合适的方案:
1. 客户端拉取而不是服务器推送。服务器上可能有一个方法,客户端定期调用该方法获取其结果。然而,这种方法似乎非常丑陋,它引入了额外的延迟、带宽和时间问题。也无法解决操作伪造问题。直接通知也是非常理想的。
2. TCP连接本身允许双向通信,并且可以明确识别客户端,因此RMI或JRemoting可能被黑客攻击以支持它,但我不知道如何做,也不知道是否存在任何现有的解决方案。
3. 消息传递。我不确定消息传递框架是否支持身份验证/会话或客户端识别。我肯定会失去远程方法。
4. 我相信正确的解决方案是找到一个远程方法调用框架,支持上述所有内容。
总之,我正在寻找一种方式:
- 异步调用服务器或将消息传递给它 - 异步调用客户端或将消息传递给它,即使在防火墙或NAT后面 - 识别发送操作的客户端 - 最好能够调用方法,而不仅仅是传递消息 - 保持使用JUnit和Mockito轻松测试(每台机器多个客户端)的能力
是否有支持这些功能的远程方法调用框架?哪个是最好的?