/// <summary> /// /// </summary> /// <param name="sender"></param> /// <param name="eventArgs"></param> private void ZoneInitOnceServer(object sender, BaseWorldEventArgs eventArgs) { ////////////////////////////////////////////////////////////////////////// // m_ListenerMessagePump.EventNetStateCreate += new EventHandler <NetStateInitEventArgs>(this.ListenerInitNetState); m_ConnecterMessagePump.EventNetStateCreate += new EventHandler <NetStateInitEventArgs>(this.ConnecterIniNetState); m_ListenerMessagePump.EventProcessReceive += new EventHandler <NetStateEventArgs>(this.ListenerProcessReceive); m_ConnecterMessagePump.EventProcessReceive += new EventHandler <NetStateEventArgs>(this.ConnecterProcessReceive); m_ListenerMessagePump.AddListener(m_Listener); m_ConnecterMessagePump.AddConnecter(m_Connecter); m_World.AddMessagePump(m_ListenerMessagePump); m_World.AddMessagePump(m_ConnecterMessagePump); ////////////////////////////////////////////////////////////////////////// // 开始注册协议 // 客户端的协议 ZonePacketHandlers.Register((long)ZoneOpCodeToZoneCluster.SMSG_LOGIN_ZONE_CLUSTER_RESULT, 4 + 0, false, new PacketReceiveCallback(ZonePacketHandlers.Zone_HandlerLoginZoneClusterResult)); ZonePacketHandlers.Register((long)ZoneOpCodeToZoneCluster.SMSG_ADD_CURRENT_ZONE_RESULT, 4 + 0, false, new PacketReceiveCallback(ZonePacketHandlers.Zone_HandlerAddCurrentZoneResult)); ZonePacketHandlers.Register((long)ZoneOpCodeToZoneCluster.SMSG_REMOVE_CURRENT_ZONE_RESULT, 4 + 0, false, new PacketReceiveCallback(ZonePacketHandlers.Zone_HandlerRemoveCurrentZoneResult)); ZonePacketHandlers.Register((long)ZoneOpCodeToZoneCluster.SMSG_PONG_ZONE_CLUSTER, 4 + 0, false, new PacketReceiveCallback(ZonePacketHandlers.Zone_HandlerPongZoneResult)); ZonePacketHandlers.Register((long)ZoneOpCodeFromZoneCluster.SMSG_LOGIN_ZONE, 4 + 0, false, new PacketReceiveCallback(ZonePacketHandlers.Zone_HandlerLoginZone)); ZonePacketHandlers.Register((long)ZoneOpCodeFromZoneCluster.SMSG_NOTIFY_ADD_ZONE, 4 + 0, false, new PacketReceiveCallback(ZonePacketHandlers.Zone_HandlerNotifyAddZone)); ZonePacketHandlers.Register((long)ZoneOpCodeFromZoneCluster.SMSG_NOTIFY_REMOVE_ZONE, 4 + 0, false, new PacketReceiveCallback(ZonePacketHandlers.Zone_HandlerNotifyRemoveZone)); ZonePacketHandlers.Register((long)ZoneOpCodeFromZoneCluster.SMSG_PING_ZONE, 4 + 0, false, new PacketReceiveCallback(ZonePacketHandlers.Zone_HandlerPingZone)); ConnectToZoneClusterServer(); }
/// <summary> /// /// </summary> /// <param name="netState"></param> private void ConnecterProcessReceive(object sender, NetStateEventArgs eventArgs) { if (eventArgs.NetState == null) { throw new Exception("Zone.ConnecterProcessReceive(...) - netState == null error!"); } if (eventArgs.NetState.ReceiveBuffer == null) { throw new Exception("Zone.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, "Zone.ConnecterProcessReceive(...) - iPacketSize < PACKAGE_HEAD error!"); eventArgs.NetState.Dispose(); // 断开 return; } if (iReceiveBufferLength < iPacketSize) { // 等待数据包的完整 break; } if (iPacketSize > BUFFER_SIZE) // 数据包过大 { LOGs.WriteLine(LogMessageType.MSG_ERROR, "Zone.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, "Zone.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 = ZonePacketHandlers.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 ZonePacketHandlersConstructorTest() { ZonePacketHandlers target = new ZonePacketHandlers(); Assert.Inconclusive( "TODO: 实现用来验证目标的代码" ); }