我正在使用 Lidgren.Networking 在客户端/服务器架构中的服务器和客户端之间发送数据。我创建了一个 Packet 类,以便在通过网络发送数据包时使用。
数据包.cs
public abstract class Packet : IPackable
{
public abstract void PackIntoNetMessage(NetOutgoingMessage msg);
public abstract void PopulateFromNetMessage(NetIncomingMessage msg);
}
IPackable.cs
interface IPackable
{
void PackIntoNetMessage(NetOutgoingMessage msg);
void PopulateFromNetMessage(NetIncomingMessage msg);
}
然后我有这样的应用程序特定数据包类
public class PositionPacket : Packet
{
public int PosX { get; set; }
public int PosY { get; set; }
public override void PackIntoNetMessage(NetOutgoingMessage m)
{
m.Write((byte)Networking.PacketTypes.PositionPacket);
m.Write(PosX);
m.Write(PosY);
}
public override void PopulateFromNetMessage(NetIncomingMessage m)
{
PosX = m.ReadInt32();
PosY = m.ReadInt32();
}
}
发送数据包很容易,我只需创建一个数据包和 PackIntoNetMessage(msg) 然后发送它。但是当我尝试接收数据包时,我遇到了一些烦人的结构问题。
我从读取第一个字节开始
var packetType = (Networking.PacketTypes)incomingMsg.ReadByte();
但是然后我必须为每种数据包类型进行一个切换,以便获得正确的构造函数。
switch (packetType)
{
case Networking.PacketTypes.PositionPacket:
incPacket = new Packets.PositionPacket();
break;
default:
incPacket = null;
break;
}
//Populate packet from net message
incPacket.PopulateFromNetMessage(incomingMsg);
这是我不喜欢的部分。我希望能够制作一个通用的数据包处理系统来处理派生自 Packet 的任何类。我想反射不是一个好主意,因为它会破坏性能。我应该如何构建它以使其更通用?