2011-03-20 57 views
-1

我设计了一个实时的物理模拟与NIO, 大约是同时移动球在多个客户端发送/接收对象/引用或对象的一部分与JavaNIO

目前(实时),即时消息发送坐标一个球与字符串解析, ,但现在我想移动多个球和想发送字符串,所以我创建4球在服务器上的一些通用机制。

如何认识到每个球的坐标对应于客户端上的同一个球(我也是在客户端创建的),并且每个球可以根据其从服务器接收到的坐标移动。

这应该通过发送每个球的引用来实现,但我不知道如何通过java字节缓冲区和NIO整体来实现。

我有落实的问题,如果有人帮助我的代码示例,这将是巨大的,反正这是可以通用的,用于发送模拟数据,如物体坐标不是字符串可以接受的(如果有人做了类似的工作),但它应该实现我描述的用例。

感谢,

Jibbylala

P.S:我知道的Downvoting问题的原因是什么?

回答

0

首先第一件事情:

你需要一个对象标识来表示移动/任何东西。该对象具有与java中的任何其他对象一样的属性,在您的情况下,球具有坐标。球可能已经形成了(除了是一个完美的球体W /常数R之外),你想发送对象的描述或类型1st,然后发送它的一些属性的改变。 对于对象的身份,你可以使用一个长的甚至是UUID,用2个多头代表(16ytes)

你甚至可以使用标准的Java序列化,但我建议不要,除非你精通此事(但你”那么没有问过这个问题)。

虽然制作二进制协议并不难,以取代你自己的基于字符串的表示,但它也不是一个简单的任务,第一个计时器。

NIO本身具有ByteBuffer功能,但不应对表示数据的外部/流模型施加任何影响。如果你能够以某种有意义的方式将“球”表示成字节[],则可以通过ByteArray实现相同的效果。

+0

可能会让你错误,最后一段:你说的是将整个对象作为字节发送,我已经使用过,但不想再使用,关于你的第一段方法,它不是关于对象标识而是相同参考或同一对象 – 2011-03-20 20:18:11

+0

java中的序列化非常灵活。但是,您可能有自己的理由放弃它,那么您需要一个外部(序列化)表单来表示数据。想象一下,如果你能实现它,你必须将球状态存储(并恢复)到一个文件中,但NIO问题没有什么不同。 – bestsss 2011-03-21 22:02:34

0

将RMI与KryoNet一起使用,那么您只需使用远程方法调用,并且调用足够高效,以至于您不再需要担心它们。在网站上有RMI示例供您开始使用。如果您需要实时客户端与模拟球进行交互,它会变得更加复杂一些,您可能需要使用UDP,但除此之外,您只需发送位置即可。您应该尝试将信息整合到您的世界对象中的一种方法中。

+0

谢谢,但相对复杂的解决方案=) – 2011-04-30 01:02:04

+0

不是。组帧数据流更难。 – 2011-04-30 01:47:30