2011-09-28 84 views
7

对于一个学校项目,我们应该创建一个Java游戏(它应该是客户端/服务器),可以通过互联网进行多人游戏(我们在学校编程,所以这不是作业)。游戏是基于回合的,但应该有一个聊天,这是实时的。然而,我们都没有网络编程方面的经验,而且我对它的了解越多,我似乎也有更多的问题。Java多人游戏 - 网络概念

我的第一个想法是使用套接字API来实现多人部分。服务器等待来自客户端的新数据。但是,有多种类型的数据可供接收,如聊天消息,移动等。另外,一旦与服务器建立连接,应发送一些初始数据(如播放机的名称)。服务器应该能够看到它收到的是什么类型的消息,但是如何?我正在考虑用字符串字段type创建类Message。但在我的服务器代码,我会得到这样的代码:

在有很多不同类型的数据的发送(会有),这看起来并不像最有效的方式。此外,这意味着服务器和客户端都应该有这个消息类/接口(重复代码)。

其他游戏的东西呢?例如,玩家1将他的角色移动到击败另一个角色的位置。玩家1的客户计算这种失败并应用正确的动作。但是应该发送给服务器的是什么?只是新玩家的位置或失败?有了第一个选项,这意味着所有其他客户都应该进行计算。这不会造成什么麻烦吗?由于我之前没有网络编程经验,所以我对如何完成所有这些事情感到困惑。

我也读过另一个线程在这里Stackoverflow RMI可能是一个更好的选择。阅读了一些有关这方面的信息后,我了解了RMI是什么,但我仍然无法确定它是否适合此项目。任何提示为此?

正如你所看到的,我对如何从这个项目的网络部分开始有点困惑。我搜索了一些游戏编程书籍(对于Java而言),但他们都不关注网络部分。我还搜索了Java网络书籍,但是这些似乎集中在技术上,而不是良好的代码实践。

如果有人知道一本好书或在正确的锻炼方面有一些建议,将不胜感激。

感谢

+7

“...在学校编程,所以它不是功课” 。经典。 – CPerkins

+0

至少他不想要代码。 –

+0

@ CPerkins:我们应该在学校为这个项目工作,是的。我并没有要求任何人做我的工作,只是询问如何实施这一点。 – Bv202

回答

7

你是在正确的道路上,但也有几件事情需要清理。

如果你使用套接字,你已经发现你需要定义一个协议 - 一种沟通移动和游戏状态的相互语言。套接字将允许您以任何您想要的格式发送任何类型的数据。它看起来像在考虑序列化一个类Message来发送这种类型,这是一个做事情的过程。如果你使用RMI(它有自己的协议),你会像调用Java方法那样工作,但实质上你正在做类似的事情,序列化数据并通过套接字传递它。

关于在客户端和服务器之间共享代码没有任何明显的错误 - 事实上,大多数服务都以某种形式做到这一点。您的客户端和服务器都可以使用通用库来定义传递的消息类。 RMI使用方法存根来确定接口。各种Web服务定义了如何调用方法。总的想法是只暴露接口,而不是实现。

关于您的代码,对于每种消息类型都可能有更清晰的消息子类,并且可以为每条消息添加其他参数。然后你可以有一个MessageProcessor的类,如:

class MessageProcessor{ 
    void process(Move1Message m) {...} 
    void process(Move2Message m) {...} 
    .... 

} 

至于送什么 - 总的原则应该是在客户端负责发送其移动到服务器,别的它是一个奖金,因为服务器需要验证移动的合法性。服务器应该始终是游戏状态的决定因素,以避免作弊和错误的客户端实现

除非您有兴趣学习如何实现自己的协议或使用Java套接字库,否则它会更容易使用RMI。您也可以使用SOAP,REST或任何其他协议,但我不打算考虑现在要使用哪一个。我没有任何超出the RMI documentation的建议,但我认为this book有很多网络代码示例。

0

与插座去当每个客户都会有它自己的连接上服务器线程将等待(不要忘记刷新客户端上的数据流,否则你会永远等待)

每条线将是一个单独的消息,并区分消息类型,您可以在每条消息的开始处使用“标题”(在开始时具有特定的3个字符的序列),如msg,mov,lgn,并使用带开关的trie式选择来快速决定哪一个你得到


wh在使用RMI时,您可以让服务器保留一个管理器对象(在注册表中导出并注册),客户端可以在该对象上请求一个“连接”对象,该对象将与套接字实现中的连接相同,但您可以有一个方法,你想做的每件事情,虽然回调将需要以其他方式完成(与你有一个连接准备好的插座)