我用NIO设计了一个实时物理模拟, 这是关于在多个客户端上同时(实时)移动球
目前,我通过字符串解析发送一个球的坐标, 但现在我想移动多个球并且 想要除了发送字符串 之外还有一些通用机制,所以我在服务器上创建了4个球。
如何才能意识到,每个球的坐标对应于客户端上的同一个球(我也是在客户端上创建的),并且每个球都可以根据其从服务器接收到的坐标进行移动。
这应该通过发送每个球的引用来实现,但我不知道如何用java字节缓冲区和NIO整体来实现。
我遇到了实现的问题,如果有人帮我提供代码示例,那就太好了, 无论如何都可以发送模拟数据,如字符串以外的对象坐标 可以接受(如果有人做了类似的工作),但它应该实现我所描述的用例。
谢谢,
Jibbylala
P.S:我可以知道 Downvoting 问题的原因吗?答案 0 :(得分:0)
首先要做的事情是:
你需要一个对象标识来表示移动/无论什么东西。该对象具有与java中的任何其他对象一样的属性,在您的情况下,球具有坐标。可能球有形状(除了是一个具有常数R的完美球体),你想先发送对象的描述或类型,然后再改变它的一些属性。 对于对象标识,您可以使用单个long或甚至UUID,但由2个long(16ytes)表示
你甚至可以使用标准的java序列化,但除非你精通这个问题,否则我会提出反对意见(但你当时没有问过这个问题)。
虽然制作二进制协议并不难以替换自己的基于字符串的表示,但对于第一个计时器来说,这也不是一件容易的事。
NIO本身具有ByteBuffer功能,但不应对您表示数据的外部/流模型产生任何影响。如果你能够以一种有意义的方式将“球”表示为byte [],你可以用ByteArray实现相同的效果。
答案 1 :(得分:0)
将RMI与KryoNet一起使用,然后您只需使用远程方法调用,并且调用足够高效,您不再需要担心它们。网站上有RMI示例供您开始使用。如果您需要与模拟球进行实时客户端交互,则会变得有点复杂,您可能需要使用UDP,否则您只需发送位置即可。您应该尝试将信息合并到您的世界对象中的方法中。