Ejemplo n.º 1
0
        /// <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();
        }
Ejemplo n.º 2
0
        /// <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: 实现用来验证目标的代码" );
 }