Ejemplo n.º 1
0
        private MyGameNetwork()
        {
            cacheStream        = new MemoryStream();
            packetMsgProcesses = new Dictionary <short, PacketMagProcessHandler>();
            packetCodecMgr     = PacketCodecManager <Packet, PacketDecodeHandler <Packet>, PacketEncodeHandler> .getInstance();

            packetCodecMgr.registerCoder(typeof(Packet), Packet.createPBDecodeHandler <Packet>(Packet.decodeHttps), Packet.createPBEncodeHandler());
        }
Ejemplo n.º 2
0
 public static PacketCodecManager <T, D, E> getInstance()
 {
     if (instance == null)
     {
         instance = new PacketCodecManager <T, D, E>();
     }
     return(instance);
 }
Ejemplo n.º 3
0
        /// <summary>
        /// 分包,先将传入的bytes数据写入到cacheStream流的尾部,再将得到的cacheStream复制到新的流中
        /// 从新流中分包得到数据,如果当前流中还有数据则继续分包,分包到最后如果有多余的数据不能完成
        /// 分包操作,则保留这部分数据到cacheStream中等待下次的数据接收,在进行分包。
        /// </summary>
        /// <param name="bytes"></param>
        /// <param name="index"></param>
        private void SplitPackage(byte[] bytes, int count)
        {
            cacheStream = new MemoryStream();
            cacheStream.Write(bytes, 0, count);
            cacheStream.Seek(0, SeekOrigin.Begin);
            long cacheStreamPos = 0;

            //记录当前流的位置
            while (cacheStream.Position < cacheStream.Length)
            {
                Packet packet = msgPool.rent();
                uint   id     = PacketCodecManager <Packet, PacketDecodeHandler <Packet>, PacketEncodeHandler> .getHashID(typeof(Packet));

                packetCodecMgr.decode(id, cacheStream, ref packet);
                if (packet == null)
                {
                    Log.Logger.warn(Log.Module.Network, "解析失败!");
                }
                else if (packet.Opcode == 514)
                {
                    //Log.Logger.warn(Log.Module.Network, "收到数据,操作码(Opcode):" + packet.Opcode);
                }
                else
                {
                    Log.Logger.warn(Log.Module.Network, "==========================================收到514以外数据,操作码(Opcode):" + packet.Opcode);
                }

                if (packet != null)
                {
                    lock (recvQueue)
                    {
                        recvQueue.Enqueue(packet);
                    }
                    decodeFaildNumber = 0;
                    cacheStreamPos    = cacheStream.Position;
                }
                else
                {
                    decodeFaildNumber++;
                    Log.Logger.warn(Log.Module.Network, "解析失败:" + decodeFaildNumber + "次,重试" + decodeFaildNumberMax + "次后,清空接受缓存");
                    if (decodeFaildNumber == decodeFaildNumberMax)
                    {
                        cacheStream.Close();
                        cacheStream.Dispose();
                        cacheStream = new MemoryStream();
                    }
                    else
                    {
                        cacheStream.Seek(cacheStreamPos, SeekOrigin.Begin);
                        setCapacity();
                    }
                    break;
                }
                setCapacity();
            }
        }