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()); }
public static PacketCodecManager <T, D, E> getInstance() { if (instance == null) { instance = new PacketCodecManager <T, D, E>(); } return(instance); }
/// <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(); } }