2012-07-28 87 views
-1

作为学习实验的一部分,我想制作一个网络应用程序。我仍然在学习多线程,并且我制作了一个简单的多线程“游戏”,它涉及在屏幕上绘制精灵,玩家可以在其中移动它们。Java网络游戏(可能使用NIO)

对于这个新项目,我想简单一些,只是为了体验和学习。我想创建一个服务器,其中多个客户端可以连接到它。服务器将包含“游戏对象”,它只是一个包含x和y位置,字符串名称,识别它的ID和速度(dx和dy)的对象。

“服务器”应用程序将具有诸如工作线程更新对象位置(使用它们的速度)的功能,并且还会向客户端发送所有游戏对象的“状态”,以便客户端可以绘制它们供玩家看。

只要玩家按下键盘上的按钮并生成KeyEvent,客户端也会发送服务器数据。服务器将读取这些数据并通过更新玩家的游戏对象来处理它。例如,如果玩家按下左箭头键,则客户端将发送服务器数据,指示左键被按下,服务器将查找与客户端关联的游戏对象(也许我会将对象存储在Map中,如? )

问题是如何做到这一点。我从来没有做过任何这种规模的网络。到目前为止,我所做的最多的是一个有问题的双人游戏。由于这是基于回合的,所以我现在试图制作的应用程序非常不同。作为研究,我阅读了关于Oracle的整个并发课程。我还阅读了关于NIO的这个教程。我以前从未使用过NIO,但我被多人推荐使用它。通过阅读代码并了解它的工作原理,我学到了很多关于多线程和并发的知识。

由于SocketChannel使用ByteBuffers进行通信,我想到的一个策略是获取GameObjects列表并将其序列化为一个字节数组。然后用ByteArray创建一个ByteBuffer并将其发送给客户端。然后客户端将获得加载到服务器中的所有GameObjects,并能够根据它们的类型和状态来绘制所有的GameObjects。与此有关的一个问题是字节数​​组可能变得非常大。我用256个GameObjects进行了测试,并得到了一个高达9KB的字节数组。如果我压缩字节数组,大小约为96字节。不过,我不知道这是否太大,无法每秒发送15次到客户端。

我知道的另一个选择是按字节发送信息字节。例如,发送的第一个字节可以识别我发送的游戏对象的类型(例如:cat,car,person),接下来的两个字节可以识别X位置,然后接下来的两个Y位置,然后使用最后一个字节来识别对象的状态。使用这些数据,客户可以在收到的位置上绘制一个精灵。

我所说的一切的一个大问题是,客户端将无法与任何对象进行交互。客户端将能够发送简单的命令到服务器,并在其位置“查看”游戏对象的精灵。如果服务器想要告诉游戏对象执行特定动作,那么很难绘制它,因为我只是将静态精灵画到屏幕上,而不是与精灵进行交互。

我也不确定NIO是否是最好的主意。大多数我讨论过的人都会推荐它,但我不太了解实现非阻塞NIO服务器和多线程常规java.net。*服务器之间的实际区别。我的猜测是非阻塞服务器比多线程服务器有更好的性能,而且我只会遇到更少的问题,只有1个线程而不是每个连接多个线程。

最后,我得到了不论是否使用TCP或UDP的混合建议。我从来没有使用过UDP。一些强烈建议TCP,而另一些强烈建议UDP。

正如你所看到的,我相当无组织,不知道该怎么做。我觉得我已经阅读了很多关于网络和并发性的知识,而且我已经足够了解Swing制作图形游戏。我只是不知道如何把它放在一起。

+0

tldr;你可能想要打破这个问题/提出更具体的问题 – Toby 2012-07-30 09:47:21

回答

0

也许考虑使用Netty。我发现它对快速应用程序开发非常有用,并且对于大多数服务器和客户端应用程序来说足够快。通过使用Java NIO的反应器设计模式的原始实现,您可以获得更快的速度,但是它会花费更多的工作量和难以调试的代码。