【问题标题】:Multiplayer game client/server architecture RMI/JMS/Sockets多人游戏客户端/服务器架构 RMI/JMS/Sockets
【发布时间】:2010-11-20 03:19:47
【问题描述】:

我正在用 Java 编写一个回合制纸牌游戏,但需要一些关于使其成为多人游戏的建议。玩家可以创建一个多人游戏,然后其他人可以加入该游戏,轮流玩他们的动作。我花了几个小时研究实现这一点的所有不同方法,但确实可以提供一些帮助。我将列出要求以及到目前为止我发现的内容:

  • 它完全是 Java 游戏,因此使用 RMI 之类的东西不是问题
  • 玩家移动,这个移动被发送到服务器,服务器发送这个移动到游戏中的其他玩家(客户端)。
  • 服务器需要存储所有正在进行的游戏以及其中的玩家(目前使用HashMap<UniqueGameID, GameObject> 进行此操作。

到目前为止,我一直在尝试使用套接字和 RMI,看起来:

RMI:

+ 处理多线程和对 hashmap 的访问

-要么必须轮询服务器以查看玩家是否已移动,要么使用无法通过防火墙的回调

套接字:

+ 允许异步回调(?)

- 无法从产生的多个线程轻松访问 hashmap(?)

-比RMI更复杂

我也一直在研究 JMS、JINI/JavaSpaces、JGroups 以及我能找到的任何其他东西,但我不知道哪个最适合。我已经启动并运行了 RMI 的客户端->服务器部分,但服务器->客户端似乎不可能,因为轮询效率低下且不可扩展

非常感谢您的任何建议。

非常感谢

编辑:我后来发现了 ConcurrentHashMap,我认为它可以解决我的一个问题。

【问题讨论】:

    标签: java networking rmi


    【解决方案1】:

    看看ZeroMQ。它抽象了您使用套接字时的大部分开销,并且还允许同步和异步消息。将其视为 RMI 和 Sockets 之间的中间地带。

    【讨论】:

    • 谢谢,直到现在我才知道这一点
    【解决方案2】:

    Second Life 的创建者已在线发布了他们的消息基础架构讨论结果,其中包含与 cmets 的消息解决方案列表,了解它们的优缺点:

    Message Queue Evaluation Notes(第二人生维基)

    【讨论】:

      【解决方案3】:

      你考虑过Hazelcast吗?这支持分布式集合和其他数据结构。作为一款游戏,我相信它足够可靠。

      ■分布式java.util.{Queue, Set, List, Map} ■分布式java.util.concurrency.locks.Lock ■分布式java.util.concurrent.ExecutorService

      ■用于一对多映射的分布式MultiMap ■发布/订阅消息的分布式主题 ■分布式索引和查询支持 ■通过 JCA 的事务支持和 J2EE 容器集成

      ■安全集群的套接字级加密 ■地图的Write-Through和Write-Behind持久性 ■用于远程访问集群的Java客户端 ■动态HTTP会话集群

      ■支持集群信息和会员活动 ■动态发现 ■动态缩放 ■带备份的动态分区 ■动态故障转移 ■基于Web的集群监控工具

      【讨论】:

      • 感谢您的回复。我不认为这是一个分布式计算问题——我只打算拥有一个游戏服务器,然后在任何地方都有多个客户端,在这个服务器之间来回传递消息。如果我对 Hazelcast 的理解有误,我深表歉意(我已经阅读了一些内容),但我不知道如何将其应用于此?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-26
      • 1970-01-01
      • 2021-05-08
      • 2010-10-12
      • 1970-01-01
      相关资源
      最近更新 更多