多人游戏客户端/服务器架构 RMI/JMS/Sockets

3
我正在编写一款基于Java的回合制卡牌游戏,但需要一些关于如何使其变成多人游戏的建议。玩家可以创建一个多人游戏,其他人可以加入该游戏并轮流进行游戏。我花费了数小时研究所有不同的实现方式,但确实需要一些帮助。以下是要求和我目前所了解到的内容:
  • 这是一款完全由Java开发的游戏,因此使用类似RMI的东西不是问题
  • 玩家进行操作后,将此操作发送到服务器,服务器会将此操作发送给游戏中的其他玩家(客户端)
  • 服务器需要存储所有进行中的游戏及其中的玩家(目前正在使用HashMap<UniqueGameID, GameObject>来实现)

我迄今为止已经尝试了套接字和RMI,并且发现:

RMI:

+ 处理多线程和对哈希图的访问

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

套接字:

+ 允许异步回调(?)

- 无法轻松地从生成的多个线程中访问哈希图(?)

- 比RMI更复杂

我还研究了JMS、JINI/JavaSpaces、JGroups以及其他任何我能找到的东西,但我不知道哪一个最好。我已经成功实现了RMI的客户端-服务器部分,但似乎无法实现服务器-客户端,因为轮询效率低下且难以扩展。

非常感谢您的任何建议。

谢谢!

编辑:我后来发现ConcurrentHashMap可以解决我的一些问题。

3个回答

2

看一下ZeroMQ。它抽象了许多您在使用套接字时遇到的开销,并且还允许同步和异步消息传递。可以将其视为RMI和套接字之间的中间地带。


谢谢,直到现在我才知道这个。 - Marc

1

Second Life的创建者已经在网上发布了他们的消息基础设施讨论结果,其中包含了一份消息解决方案列表以及其优缺点的评论:

消息队列评估注释(Second Life Wiki)


0

你考虑过Hazelcast吗?它支持分布式集合和其他数据结构。对于游戏来说,我相信它足够可靠。

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

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

■安全集群的套接字级加密 ■地图的写入穿透和写入后持久性 ■Java客户端以远程访问集群 ■动态HTTP会话集群

■支持集群信息和成员事件 ■动态发现 ■动态扩展 ■带备份的动态分区 ■动态故障转移 ■基于Web的集群监控工具


谢谢您的回复。我不认为这是分布式计算的问题 - 我只打算有一个游戏服务器,然后有多个客户端位于任何地方,在该服务器之间来回传递消息。如果我对Hazelcast的理解有误,我很抱歉(我已经阅读了一些相关资料),但我看不出我如何将其应用于此? - Marc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接