コード例 #1
0
ファイル: PacketFactory.cs プロジェクト: liligege/wz_game
 public void AddPacket(PacketID_t packetID, Type type, OnPacketHandler packetHandler)
 {
     if (m_Dictionary.ContainsKey(packetID))
     {
         //-TODO: log warning
         m_Dictionary[packetID] = new PacketTypeAndHandler(type, packetHandler);
         return;
     }
     else
     {
         m_Dictionary.Add(packetID, new PacketTypeAndHandler(type, packetHandler));
     }
 }
コード例 #2
0
ファイル: PacketFactory.cs プロジェクト: liligege/wz_game
        //-- 创建消息
        public Packet CreatePacket(PacketID_t packetID)
        {
            //-- 01. valid
            if (!m_Dictionary.ContainsKey(packetID))
            {
                //-- log
                UnityEngine.Debug.Log(" don't contain  the id " + packetID);
                return(null);
            }

            PacketTypeAndHandler tmpProcessInfo = m_Dictionary[packetID];

            if (tmpProcessInfo.m_packetType == null)
            {
                //-- log
                return(null);
            }
            return(new Packet((PACKET_TYPE)packetID));
        }
コード例 #3
0
ファイル: LogicRecvHandler.cs プロジェクト: liligege/wz_game
        public bool ProcessPacket(ref byte serverMsgIndex)
        {
            if (m_LogicRecvBufQueue == null)
            {
                return(false);
            }

            //-- 判断是否有待处理的逻辑层消息缓冲数据
            LogicRecvBuffer logicRecvBuf = m_LogicRecvBufQueue.GetUsedBuf();

            if (logicRecvBuf == null)
            {
                return(true);
            }

            MemoryStream memStream = logicRecvBuf.GetMemoryStream();

            if (memStream == null)
            {
                return(false);
            }

            //-- test

            if (memStream.Length == memStream.Position)
            {
                //Console.WriteLine("memStream.Length == memStream.Position");
            }

            //-- 如果m_RemainingStream长度不为0,则之后处理的memStream的前面要加上m_RemainingStream。
            if (m_LogicRemainingBuf.Length != 0)
            {
                m_LogicRemainingBuf.Write(memStream.GetBuffer(), 0, (Int32)memStream.Length);
                Array.Clear(memStream.GetBuffer(), 0, (Int32)memStream.Length);
                memStream.Write(m_LogicRemainingBuf.GetBuffer(), 0, (Int32)m_LogicRemainingBuf.Length);
                memStream.Seek(0, SeekOrigin.Begin);
                Array.Clear(m_LogicRemainingBuf.GetBuffer(), 0, (Int32)m_LogicRemainingBuf.Length);
                m_LogicRemainingBuf.SetLength(0);
            }

            //-- memStream中的消息反序列化操作
            m_BinaryReader = new BinaryReader(memStream, System.Text.Encoding.ASCII);

            Int32      iTmpHead         = 0;
            Int32      iTmpTotalSize    = (Int32)memStream.Length;
            Int32      iTmpDeltaLenth   = 0;
            PacketID_t tmpPacketID      = (PacketID_t)PACKET_TYPE.PACKET_TYPE_NONE;
            Int16      iTmpPacketUInt32 = 0;

            while (true)
            {
                iTmpDeltaLenth = iTmpTotalSize;
                memStream.Seek(iTmpHead, SeekOrigin.Begin);
                iTmpDeltaLenth -= iTmpHead;
                UnityEngine.Debug.Log("the head is " + iTmpHead + " and the  deltaLength is " + iTmpDeltaLenth);
                //-- 如果剩余的消息长度小于Header,则放入m_RemainingStream中。等待下次帧循环来处理
                if (iTmpDeltaLenth < PacketUtil.PACKET_HEADER_SIZE)
                {
                    if (iTmpDeltaLenth > 0)
                    {
                        m_LogicRemainingBuf.Write(memStream.GetBuffer(), iTmpHead, iTmpDeltaLenth);
                    }
                    logicRecvBuf.SetUsedFlag(false);
                    break;
                }
                UnityEngine.Debug.Log("the temp delta length is " + iTmpDeltaLenth);

                iTmpPacketUInt32 = m_BinaryReader.ReadInt16();;
                //-- 消息没有接收完全。
                if (iTmpDeltaLenth < iTmpPacketUInt32)
                {
                    if (iTmpDeltaLenth > 0)
                    {
                        m_LogicRemainingBuf.Write(memStream.GetBuffer(), iTmpHead, iTmpDeltaLenth);
                    }
                    logicRecvBuf.SetUsedFlag(false);
                    Console.WriteLine("消息没有接收完全");
                    break;
                }

                try
                {
                    tmpPacketID = m_BinaryReader.ReadUInt16();
                    UnityEngine.Debug.Log("THE PACKET ID IS ====================" + tmpPacketID);
                }
                catch (System.Exception ex)
                {
                    CommonDebugLog.LogWarning("ex:=[" + ex.ToString() + "]");
                }


                Packet packet = PacketFacotry.GetInstance().CreatePacket(tmpPacketID);
                if (packet == null)
                {
                    //-- 抛出异常,根据PacketID创建Packet失败
                    //-- 略过这个出错的消息,并继续处理
                    iTmpHead += iTmpPacketUInt32;
                    CommonDebugLog.LogWarning(string.Format("CreatePacket Failed packetID = {0}", tmpPacketID));
                    //Console.WriteLine("packet == null");
                    continue;
                }

                try
                {
                    if (!packet.ReadPacketBody(m_BinaryReader, (Int16)(iTmpPacketUInt32 - 4)))
                    {
                        Console.WriteLine("packet.ReadPacketBody( m_BinaryReader) == false");
                        //-- log
                    }
                    UnityEngine.Debug.LogError("begin process packet ");
                    PacketFacotry.GetInstance().ProcessPacket(packet);

                    NetClient.GetInstance().RemoveWatingPackets((PACKET_TYPE)packet.GetPacketID());
                }
                catch (System.Exception ex)
                {
                    CommonDebugLog.LogWarning(ex.ToString());
                }

                //-- 执行成功,set iTmpHead
                iTmpHead += (Int32)(iTmpPacketUInt32);
            } //-- end_while (true)
            return(true);
        }
コード例 #4
0
ファイル: PacketFactory.cs プロジェクト: liligege/wz_game
 public void removePacket(PacketID_t packetID)
 {
     m_Dictionary.Remove(packetID);
 }