Exemple #1
0
        public void ProcessCommands(ConnectManager connMan)
        {
            // 一次最多执行10个
            for (int i = 0; i < 10; i++)
            {
                if (!m_InputStream.HasData())
                {
                    return;
                }
                int size = m_InputStream.TryReadBuffer(m_temp);
                //parse packet id and length
                if (size < 4)
                {
                    return;
                }
                ushort len      = BitConverter.ToUInt16(m_temp, 0);
                ushort packetId = BitConverter.ToUInt16(m_temp, 2);
                if (size < len)
                {
                    //还没接收完或者包不完整
                    return;
                }
                m_InputStream.SetReadIndex(len);

                try
                {
                    // 调用handle
                    IPacketFactory factory = connMan.GetPacketFactory((Packets.PacketIdDefine)packetId);
                    if (factory != null)
                    {
                        m_tempStream.Seek(0, SeekOrigin.Begin);
                        m_tempStream.SetLength(len - c_headSize);
                        object         data    = Serializer.Deserialize(factory.GetDataType(), m_tempStream);//GC狂魔
                        IPacketHandler handler = connMan.GetPacketHandler((Packets.PacketIdDefine)packetId);
                        if (handler != null)
                        {
                            handler.Handle(this, data);
                        }
                    }
                }
                catch (Exception e)
                {
                    LogModule.LogInfo("Handle packet error, Packet id : {0}, len : {1}, msg : {2}", packetId, len, e.Message);
                    Shutdown();
                    break;
                }
            }
        }