/// <summary> /// /// </summary> /// <param name="sender"></param> /// <param name="eventArgs"></param> private void DomainWorld_InitOnceServer(object sender, BaseWorldEventArgs eventArgs) { ////////////////////////////////////////////////////////////////////////// // m_ListenerMessagePump.EventNetStateCreate += new EventHandler <NetStateInitEventArgs>(ListenerInitNetState); m_ConnecterMessagePump.EventNetStateCreate += new EventHandler <NetStateInitEventArgs>(ConnecterIniNetState); m_ListenerMessagePump.EventProcessReceive += new EventHandler <NetStateEventArgs>(ListenerProcessReceive); m_ConnecterMessagePump.EventProcessReceive += new EventHandler <NetStateEventArgs>(ConnecterProcessReceive); m_ListenerMessagePump.AddListener(m_Listener); m_ConnecterMessagePump.AddConnecter(m_Connecter); m_World.AddMessagePump(m_ListenerMessagePump); m_World.AddMessagePump(m_ConnecterMessagePump); ////////////////////////////////////////////////////////////////////////// // 开始注册协议 // 客户端的协议 DomainPacketHandlers.Register((long)DomainOpCodeToZoneCluster.SMSG_LOGIN_ZONE_CLUSTER_RESULT, 4 + 0, false, new PacketReceiveCallback(DomainPacketHandlers.Domain_HandlerLoginZoneClusterResult)); DomainPacketHandlers.Register((long)DomainOpCodeToZoneCluster.SMSG_NOTIFY_ADD_ZONE_CLUSTER_RESULT, 4 + 0, false, new PacketReceiveCallback(DomainPacketHandlers.Domain_HandlerNotifyAddZoneClusterResult)); DomainPacketHandlers.Register((long)DomainOpCodeToZoneCluster.SMSG_NOTIFY_REMOVE_ZONE_CLUSTER_RESULT, 4 + 0, false, new PacketReceiveCallback(DomainPacketHandlers.Domain_HandlerNotifyRemoveZoneClusterResult)); DomainPacketHandlers.Register((long)DomainOpCodeToZoneCluster.SMSG_PONG_ZONE_CLUSTER, 4 + 0, false, new PacketReceiveCallback(DomainPacketHandlers.Domain_HandlerPongZoneCluster)); DomainPacketHandlers.Register((long)DomainOpCodeFromZoneCluster.SMSG_LOGIN_DOMAIN, 4 + 0, false, new PacketReceiveCallback(DomainPacketHandlers.Domain_HandlerLoginDomain)); DomainPacketHandlers.Register((long)DomainOpCodeFromZoneCluster.SMSG_ADD_CURRENT_ZONE_CLUSTER, 4 + 0, false, new PacketReceiveCallback(DomainPacketHandlers.Domain_HandlerAddCurrentZoneCluster)); DomainPacketHandlers.Register((long)DomainOpCodeFromZoneCluster.SMSG_REMOVE_CURRENT_ZONE_CLUSTER, 4 + 0, false, new PacketReceiveCallback(DomainPacketHandlers.Domain_HandlerRemoveCurrentZoneCluster)); DomainPacketHandlers.Register((long)DomainOpCodeFromZoneCluster.SMSG_PING_DOMAIN, 4 + 0, false, new PacketReceiveCallback(DomainPacketHandlers.Domain_HandlerPingDomain)); ListenerDomainServer(); }
/// <summary> /// /// </summary> /// <param name="netState"></param> internal void ConnecterProcessReceive(object sender, NetStateEventArgs eventArgs) { if (eventArgs.NetState == null) { throw new Exception("Domain.ConnecterProcessReceive(...) - netState == null error!"); } if (eventArgs.NetState.ReceiveBuffer == null) { throw new Exception("Domain.ConnecterProcessReceive(...) - eventArgs.NetState.ReceiveBuffer == null error!"); } ReceiveQueue receiveQueueBuffer = eventArgs.NetState.ReceiveBuffer; if (receiveQueueBuffer.Length < PACKAGE_HEAD) { // 等待数据包的完整 return; } long iReceiveBufferLength = receiveQueueBuffer.Length; // 隔段时间就会有数据过来,所以可以不用锁定的,锁定了也没用,很难保证多线程中处理了所有的数据 while (iReceiveBufferLength >= PACKAGE_HEAD) { // ReceiveQueue内部已经有锁定 long iPacketSize = receiveQueueBuffer.GetPacketLength(); if (iPacketSize < PACKAGE_HEAD) { LOGs.WriteLine(LogMessageType.MSG_ERROR, "Domain.ConnecterProcessReceive(...) - iPacketSize < PACKAGE_HEAD error!"); eventArgs.NetState.Dispose(); // 断开 return; } if (iReceiveBufferLength < iPacketSize) { // 等待数据包的完整 break; } if (iPacketSize > BUFFER_SIZE) // 数据包过大 { LOGs.WriteLine(LogMessageType.MSG_ERROR, "Domain.ConnecterProcessReceive(...) - iPacketSize > BUFFER_SIZE error!"); eventArgs.NetState.Dispose(); // 断开 return; } // 获取空数据 byte[] packetBuffer = m_ProcessorBuffers.AcquireBuffer(); // ReceiveQueue内部已经有锁定 long iReturnPacketSize = receiveQueueBuffer.Dequeue(ref packetBuffer, 0, iPacketSize); // 获取的数据不相同 if (iReturnPacketSize != iPacketSize) { LOGs.WriteLine(LogMessageType.MSG_ERROR, "Domain.ConnecterProcessReceive(...) - iReturnPacketSize != iPacketSize error!"); // 返回内存池 m_ProcessorBuffers.ReleaseBuffer(packetBuffer); eventArgs.NetState.Dispose(); // 断开 return; } // 读取的数据包 PacketReader packetReader = new PacketReader(packetBuffer, iPacketSize, PACKAGE_HEAD /*包的长度大小-2个字节、ID大小-2个字节, 4个字节跳过*/, new EventHandler <PacketIdInfoEventArgs>(this.GetPacketID)); // 获取数据包命令的ID long iPacketID = packetReader.GetPacketID(); // 获取处理数据包的实例 PacketHandler packetHandler = DomainPacketHandlers.GetHandler(iPacketID); if (packetHandler == null) // 说明还没有解开当前的数据包内容 { packetReader.Trace(eventArgs.NetState); // 返回内存池 m_ProcessorBuffers.ReleaseBuffer(packetBuffer); // 获取剩下的数据长度 iReceiveBufferLength = receiveQueueBuffer.Length; continue; } // 当前需处理的数据包的大小 long iPacketHandlerLength = packetHandler.Length; if (iPacketHandlerLength > iReturnPacketSize) // 包需求的数据大小大于得到的数据大小 { // 返回内存池 m_ProcessorBuffers.ReleaseBuffer(packetBuffer); eventArgs.NetState.Dispose(); // 断开 return; } // 处理数据 packetHandler.OnReceive(eventArgs.NetState, packetReader); // 返回内存池 m_ProcessorBuffers.ReleaseBuffer(packetBuffer); // 获取剩下的数据长度 iReceiveBufferLength = receiveQueueBuffer.Length; } }
public void DomainPacketHandlersConstructorTest() { DomainPacketHandlers target = new DomainPacketHandlers(); Assert.Inconclusive( "TODO: 实现用来验证目标的代码" ); }