ET框架关于opCode的理解
创始人
2024-05-13 07:28:05
  • 因为所有的网络消息在发送时候格式都是这样
    在这里插入图片描述
  • 对于用Protobuf定义的每一消息类型class,都需要定义一个对应消息头code
  • 在发送的时候,先将消息体进行序列化,再将code进行序列化,进行组装发送
 //这个代码没有进行过优化,会产生严重GC,不要复制使用。这里只是作为演示static byte[] PackMsg(IMessage msg){byteCollection.Clear();var code = Dispatch.GetOpCode(msg.GetType());byteCollection.AddRange(BitConverter.GetBytes(code));byteCollection.AddRange(msg.ToByteArray());return byteCollection.ToArray();}
  • 我这里使用的code是ushort类型,只占用两个字节,用BitConverter可以方便转换

问题

  • 产生问题在于,protobuf是先定义.proto文件,然后根据这个文件来生成.cs文件
  • 如果直接在生成的.cs文件里面给每个消息类标记Message[Opcode.Login]会产生问题
  • 就是每次修改.proto文件重新生成的时候,会导致标记的opCode被覆盖。
    在这里插入图片描述
  • 但是还好他生成是分部类,ET框架就利用这点把消息类分成两部分,一部分是消息体,一部分是定义opCode和自己的接口这些
    在这里插入图片描述
  • 但是我比较懒,我不想写那么多。直接通过反射获取所有类型,并且按照遍历顺序给每一个打一个ID就是了
  • 客户端和服务端使用同一个程序集,所以序号也是一样的。
  • 但是潜在的问题是
  • 1.必须把客户端和服务端的消息类型定义在一起
static void GetAllMessageType(){var assembly = Assembly.GetExecutingAssembly();//注意这里标记开始codeushort startIndex = 1;foreach (var type in assembly.GetTypes()){if (type.Namespace == nameof(Message) && type.GetInterface(nameof(IMessage)) != null){msgTable.Add(startIndex, type);msgInstanceTable.Add(startIndex, (IMessage)Activator.CreateInstance(type));startIndex++;}}}

相关内容

热门资讯

猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...