Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 多人游戏客户端/服务器体系结构RMI/JMS/Sockets_Java_Networking_Rmi - Fatal编程技术网

Java 多人游戏客户端/服务器体系结构RMI/JMS/Sockets

Java 多人游戏客户端/服务器体系结构RMI/JMS/Sockets,java,networking,rmi,Java,Networking,Rmi,我正在用Java编写一个基于回合的纸牌游戏,但需要一些关于多人游戏的建议。玩家可以创建一个多人游戏,然后其他人可以加入该游戏,轮流玩他们的移动。我花了数小时研究了各种不同的方法来实现这一点,但如果有人帮忙,我真的可以做到。我将列出这些要求以及迄今为止我发现的情况: 这完全是一个Java游戏,因此使用类似RMI的东西并不是一个问题 玩家移动,此移动发送到服务器,服务器将此移动发送到游戏中的其他玩家(客户端) 服务器需要存储所有正在进行的游戏以及其中的玩家(目前使用HashMap) 到目前为止,

我正在用Java编写一个基于回合的纸牌游戏,但需要一些关于多人游戏的建议。玩家可以创建一个多人游戏,然后其他人可以加入该游戏,轮流玩他们的移动。我花了数小时研究了各种不同的方法来实现这一点,但如果有人帮忙,我真的可以做到。我将列出这些要求以及迄今为止我发现的情况:

  • 这完全是一个Java游戏,因此使用类似RMI的东西并不是一个问题
  • 玩家移动,此移动发送到服务器,服务器将此移动发送到游戏中的其他玩家(客户端)
  • 服务器需要存储所有正在进行的游戏以及其中的玩家(目前使用
    HashMap
到目前为止,我一直在试验套接字和RMI,似乎:

RMI

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

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

插座

+
允许异步回调(?)

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

-
比RMI更复杂

我还研究了JMS、JINI/JavaSpaces、JGroups和其他我能找到的东西,但我不知道哪一个最适合。我已经启动并运行了RMI的客户机->服务器部分,但是服务器->客户机似乎是不可能的,因为轮询是如此低效和不可扩展

我非常感谢你的任何建议

非常感谢


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

第二人生的创作者已经在线发布了他们的消息基础架构讨论结果,其中包含一个消息解决方案列表,并对其优缺点进行了评论:

(Second Life Wiki)

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

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

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

■安全集群的套接字级加密 ■针对映射的直写和隐藏持久性 ■用于远程访问集群的Java客户端 ■动态HTTP会话群集

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

请看。它提取了套接字的大部分开销,还允许同步和异步消息。可以将其视为RMI和套接字之间的中间地带。

感谢您的回复。不过,我不认为这是一个分布式计算问题-我只打算玩一个游戏服务器,然后是位于任意位置的多个客户端,在此服务器之间来回传递消息。如果我对Hazelcast的理解有误(我对此做了一些阅读),则表示歉意,但我不知道如何将其应用于此?谢谢,我直到现在才意识到这一点