/// <summary> /// 在刚好接收完一个完整的协议的时候调用,构造一个完整的协议包 /// </summary> public void CreatePacketFromBuffer() { try { int bodyLen = BodyLength; int protoCode = ProtoCode; object decoder = ProtoMapper.GetProtoDecoder(protoCode); if (decoder != null) { byte[] dataBytes = new byte[bodyLen - ProtoCodeLength]; //协议体等于总的协议体长度减去协议号字节 Array.Copy(protobuffBytes, Header_Length + ProtoCodeLength, dataBytes, 0, dataBytes.Length); Debug.Log("Content :" + SocketController.ByteArrayToStr(dataBytes)); System.IO.MemoryStream stream_output = new System.IO.MemoryStream(dataBytes); RuntimeTypeModel.Default.Deserialize(stream_output, decoder, decoder.GetType()); ProtoPacketQueueManager.AddPacket(decoder); //用队列在帧更新的时候处理协议,是因为有可能是在多线程下通信,而有些操作是只能在主线程执行 } } catch (System.Exception ex) { Debug.LogError("协议包创建出错:" + ex.Message + ex.StackTrace); } }
/// <summary> /// 在刚好接收完一个完整的协议的时候调用,构造一个完整的协议包 /// </summary> public void CreatePacketFromBuffer() { byte[] packetBytes = new byte[BodyLength]; //从缓存里获取属于这个协议的内容 Array.Copy(protobuffBytes, Header_Length, packetBytes, 0, packetBytes.Length); byte[] protoCodeBytes = new byte[4]; Array.Copy(packetBytes, 0, protoCodeBytes, 0, protoCodeBytes.Length); //协议的前面四位为协议号 int protoCode = BitConverter.ToInt32(protoCodeBytes, 0); ProtoBase_S2C decoder = ProtoMapper.GetProtoDecoder(protoCode); if (decoder != null) { decoder.Decode(packetBytes); ProtoPacketQueueManager.instance.AddPacket(decoder); } }