Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.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 如何处理服务器和客户端中的不同数据包?_Java_Networking_Multiplayer_Packet - Fatal编程技术网

Java 如何处理服务器和客户端中的不同数据包?

Java 如何处理服务器和客户端中的不同数据包?,java,networking,multiplayer,packet,Java,Networking,Multiplayer,Packet,在我计划制作的游戏服务器和客户端中,从长远来看,我需要处理很多数据包。我想知道如何处理不同的数据包的最佳实践是什么 我的数据包负载将以PacketID开始 创建一个单独的类扩展包并在那里处理逻辑是一个好主意吗?例如Packet001Login?从长远来看,这会给我很多课程 做一个巨大的切换语句是否更好?我对此表示怀疑 最好的方法是我没想到的吗 非常感谢您的建议。如果您在服务器端有足够的计算时间,您应该研究一种技术,为不同的包类型创建原型 为了说明这一点和想法,我给你一些类似UML的类描述 统一建

在我计划制作的游戏服务器和客户端中,从长远来看,我需要处理很多数据包。我想知道如何处理不同的数据包的最佳实践是什么

我的数据包负载将以PacketID开始

创建一个单独的类扩展包并在那里处理逻辑是一个好主意吗?例如Packet001Login?从长远来看,这会给我很多课程

做一个巨大的切换语句是否更好?我对此表示怀疑

最好的方法是我没想到的吗


非常感谢您的建议。

如果您在服务器端有足够的计算时间,您应该研究一种技术,为不同的包类型创建原型

为了说明这一点和想法,我给你一些类似UML的类描述

统一建模语言:

您还需要一个类,该类包含所有PacketPrototype,并决定每个PacketPrototype对象的类型,使用哪个原型来反序列化数据

你需要一个知道每个PacketPrototype的类,我称之为PacketPrototypeHolder

class PacketPrototypeHolder
+ register(PacketPrototype)
+ getPrototypeForPacketType(int Type) : PacketPrototype
关于设置时间的协议如下

PacketEnemy00 = new PacketPrototype(0)
PacketEnemy00.addData(Types.Int, 5) // health
PacketEnemy00.addData(Types.String, 16) // name
...
这意味着0类型的数据包由一个5位长的int和一个最大长度为16个字符的字符串组成

我们必须在安装后将PacketPrototype添加到我们的PacketPrototypeHolder中

class PacketPrototypeHolder
+ register(PacketPrototype)
+ getPrototypeForPacketType(int Type) : PacketPrototype
包裹持有人登记簿(包裹编号00)

如果服务器或客户机接收到我们读取数据包类型的内容,那么我们就会这样做 (您可以从位流读取数据)

Prototype.deserialize
调用从数据流中读取数据并将其放入ReceivedPackage对象中,从那里您可以通过索引操作或命名访问访问数据

作为一个例子,我用索引来做

   int UnitHealth = OfReceivedPacket.getInt(/* index, we want the 1st int */0);
   string UnitName = OfReceivedPacket.getString(/* index, we want the 1st string */0);

   and so on...
   break;
   ...
}
因此,我有效地将switch语句从网络层内部移动到了应用程序/使用层


要移除交换机,您需要一种数据驱动的方法。但是它在引擎中的实现要比硬编码方法复杂得多。

嗯,我不太明白。你能给出更多的细节或示例代码吗?好的,我明白了。那么现在我在哪里处理这个包呢?现在我可以从数据包中接收数据,但是我应该在哪里编写逻辑/代码,例如PacketEnemy00?是的。非常感谢。
   int UnitHealth = OfReceivedPacket.getInt(/* index, we want the 1st int */0);
   string UnitName = OfReceivedPacket.getString(/* index, we want the 1st string */0);

   and so on...
   break;
   ...
}