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