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)); } }
//-- 创建消息 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)); }
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); }
public void removePacket(PacketID_t packetID) { m_Dictionary.Remove(packetID); }