Exemple #1
0
    public static Packet DeserializePacket(IPacketHeader packetHeader, Stream source /*, out object customErrorData*/)
    {
        ET_CSPacketHeader header = packetHeader as ET_CSPacketHeader;

        if (header == null)
        {
            Debug.LogError("header为空.");
            return(null);
        }

        Packet packet = null;

        if (header.IsValid)
        {
            Type packetType = GetClientToServerPacketType(header.Id);

            if (packetType != null && source is MemoryStream)
            {
                object instance = Activator.CreateInstance(packetType);
                packet = (Packet)ProtobufHelper.FromStream(instance, (MemoryStream)source);
            }
            else
            {
                Debug.LogError("Can not deserialize packet for packet id '{0}'.", header.Id.ToString());
            }
        }
        else
        {
            Debug.LogError("Packet header is invalid.");
        }
        header.Clear();
        return(packet);
    }
    public bool Serialize <T>(T packet, Stream destination) where T : Packet
    {
        PacketBase packetImpl = packet as PacketBase;

        if (packetImpl == null)
        {
            Log.Warning("Packet is invalid.");
            return(false);
        }

        if (packetImpl.PacketType != PacketType.ClientToServer)
        {
            Log.Warning("Send packet invalid.");
            return(false);
        }

        //memoryStream.SetLength(memoryStream.Capacity);
        //memoryStream.Position = PacketHeaderLength;
        memoryStream.Seek(PacketHeaderLength, SeekOrigin.Begin);
        memoryStream.SetLength(PacketHeaderLength);
        //Serializer.SerializeWithLengthPrefix(memoryStream, packet, PrefixStyle.Fixed32);
        ProtobufHelper.ToStream(packet, memoryStream);

        // 头部消息
        ET_CSPacketHeader packetHeader = ReferencePool.Acquire <ET_CSPacketHeader>();

        packetHeader.Flag         = 0;                                                        //客户端发送的消息,默认flag为0,服务器会解析flag字段值
        packetHeader.PacketLength = (int)memoryStream.Length - ETPackets.ET_PacketSizeLength; // 消息内容长度需要减去头部消息长度,只包含packetSize一个字段
        packetHeader.Id           = (ushort)packet.Id;

        memoryStream.Position = 0;
        this.byteses[0].WriteTo(0, (ushort)packetHeader.PacketLength);
        this.byteses[1][0] = packetHeader.Flag;
        this.byteses[2].WriteTo(0, packetHeader.Id);
        int index = 0;

        foreach (var bytes in this.byteses)
        {
            Array.Copy(bytes, 0, memoryStream.GetBuffer(), index, bytes.Length);
            index += bytes.Length;
        }

        //Serializer.SerializeWithLengthPrefix(memoryStream, packetHeader, PrefixStyle.Fixed32);

        ReferencePool.Release(packetHeader);

        memoryStream.WriteTo(destination);

        long len = destination.Length;
        long pos = destination.Position;

        byte[] temp = (destination as MemoryStream).GetBuffer();
        return(true);
        //}
    }
Exemple #3
0
    public static IPacketHeader DeserializePacketHeader(Stream source)
    {
        ET_CSPacketHeader scHeader     = new ET_CSPacketHeader();
        MemoryStream      memoryStream = source as MemoryStream;

        if (memoryStream != null)
        {
            int    packetSize = BitConverter.ToUInt16(memoryStream.GetBuffer(), 0);
            byte   flag       = memoryStream.GetBuffer()[ETPackets.ET_MessageFlagIndex];
            ushort opcode     = BitConverter.ToUInt16(memoryStream.GetBuffer(), ETPackets.ET_MessageOpcodeIndex);

            //这里需要用服务端发过来的packetSize的值减去消息包中flag和opcode的长度,
            //因为服务端在发送消息时设置的packetSize的值是包含flag和opcode的,而
            //客户端在解析包头的时候已经解析了flag和opcode,因此剩余要解析的数据长度要减去3(flag和opcode的总长度是3个字节)
            scHeader.PacketLength = packetSize - ETPackets.ET_MessageIdentifyLength;
            scHeader.Flag         = flag;
            scHeader.Id           = opcode;
            return(scHeader);
        }

        return(null);
    }