Beispiel #1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="eventArgs"></param>
        private void ZoneClusterInitOnceServer(object sender, BaseWorldEventArgs eventArgs)
        {
            //////////////////////////////////////////////////////////////////////////
            //
            m_ListenerMessagePump.EventNetStateCreate  += new EventHandler <NetStateInitEventArgs>(ListenerInitNetState);
            m_ConnecterMessagePump.EventNetStateCreate += new EventHandler <NetStateInitEventArgs>(ConnecterInitNetState);

            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);

            //////////////////////////////////////////////////////////////////////////
            // 开始注册协议

            // 客户端的协议
            ZoneClusterPacketHandlers.Register((long)ZoneClusterOpCodeToZone.SMSG_LOGIN_ZONE_RESULT, 4 + 0, false, new PacketReceiveCallback(ZoneClusterPacketHandlers.ZoneCluster_HandlerLoginZoneResult));
            ZoneClusterPacketHandlers.Register((long)ZoneClusterOpCodeToZone.SMSG_NOTIFY_ADD_ZONE_RESULT, 4 + 0, false, new PacketReceiveCallback(ZoneClusterPacketHandlers.ZoneCluster_HandlerNotifyAddZoneResult));
            ZoneClusterPacketHandlers.Register((long)ZoneClusterOpCodeToZone.SMSG_NOTIFY_REMOVE_ZONE_RESULT, 4 + 0, false, new PacketReceiveCallback(ZoneClusterPacketHandlers.ZoneCluster_HandlerNotifyRemoveZoneResult));
            ZoneClusterPacketHandlers.Register((long)ZoneClusterOpCodeToZone.SMSG_PONG_ZONE, 4 + 0, false, new PacketReceiveCallback(ZoneClusterPacketHandlers.ZoneCluster_HandlerPongZone));

            ZoneClusterPacketHandlers.Register((long)ZoneClusterOpCodeToDomain.SMSG_LOGIN_DOMAIN_RESULT, 4 + 0, false, new PacketReceiveCallback(ZoneClusterPacketHandlers.ZoneCluster_HandlerLoginDomainResult));
            ZoneClusterPacketHandlers.Register((long)ZoneClusterOpCodeToDomain.SMSG_ADD_CURRENT_ZONE_CLUSTER_RESULT, 4 + 0, false, new PacketReceiveCallback(ZoneClusterPacketHandlers.ZoneCluster_HandlerAddCurrentZoneClusterResult));
            ZoneClusterPacketHandlers.Register((long)ZoneClusterOpCodeToDomain.SMSG_REMOVE_CURRENT_ZONE_CLUSTER_RESULT, 4 + 0, false, new PacketReceiveCallback(ZoneClusterPacketHandlers.ZoneCluster_HandlerRemoveCurrentZoneClusterResult));
            ZoneClusterPacketHandlers.Register((long)ZoneClusterOpCodeToDomain.SMSG_PONG_DOMAIN, 4 + 0, false, new PacketReceiveCallback(ZoneClusterPacketHandlers.ZoneCluster_HandlerPongDomain));

            ZoneClusterPacketHandlers.Register((long)ZoneClusterOpCodeFromZone.SMSG_LOGIN_ZONE_CLUSTER, 4 + 0, false, new PacketReceiveCallback(ZoneClusterPacketHandlers.ZoneCluster_HandlerLoginZoneCluster));
            ZoneClusterPacketHandlers.Register((long)ZoneClusterOpCodeFromZone.SMSG_ADD_CURRENT_ZONE, 4 + 0, false, new PacketReceiveCallback(ZoneClusterPacketHandlers.ZoneCluster_HandlerAddCurrentZone));
            ZoneClusterPacketHandlers.Register((long)ZoneClusterOpCodeFromZone.SMSG_REMOVE_CURRENT_ZONE, 4 + 0, false, new PacketReceiveCallback(ZoneClusterPacketHandlers.ZoneCluster_HandlerRemoveCurrentZone));
            ZoneClusterPacketHandlers.Register((long)ZoneClusterOpCodeFromZone.SMSG_ZONE_PING_ZONE_CLUSTER, 4 + 0, false, new PacketReceiveCallback(ZoneClusterPacketHandlers.ZoneCluster_HandlerZonePingZoneCluster));

            ZoneClusterPacketHandlers.Register((long)ZoneClusterOpCodeFromDomain.SMSG_LOGIN_ZONE_CLUSTER, 4 + 0, false, new PacketReceiveCallback(ZoneClusterPacketHandlers.ZoneCluster_HandlerLoginZoneCluster));
            ZoneClusterPacketHandlers.Register((long)ZoneClusterOpCodeFromDomain.SMSG_NOTIFY_ADD_ZONE_CLUSTER, 4 + 0, false, new PacketReceiveCallback(ZoneClusterPacketHandlers.ZoneCluster_HandlerNotifyAddZoneCluster));
            ZoneClusterPacketHandlers.Register((long)ZoneClusterOpCodeFromDomain.SMSG_NOTIFY_REMOVE_ZONE_CLUSTER, 4 + 0, false, new PacketReceiveCallback(ZoneClusterPacketHandlers.ZoneCluster_HandlerNotifyRemoveZoneCluster));
            ZoneClusterPacketHandlers.Register((long)ZoneClusterOpCodeFromDomain.SMSG_DOMAIN_PING_ZONE_CLUSTER, 4 + 0, false, new PacketReceiveCallback(ZoneClusterPacketHandlers.ZoneCluster_HandlerDomainPingZoneCluster));

            ConnectToDomainServer();
        }
Beispiel #2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="netState"></param>
        internal void ConnecterProcessReceive(object sender, NetStateEventArgs eventArgs)
        {
            if (eventArgs.NetState == null)
            {
                throw new Exception("ZoneCluster.ConnecterProcessReceive(...) - netState == null error!");
            }

            if (eventArgs.NetState.ReceiveBuffer == null)
            {
                throw new Exception("ZoneCluster.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, "ZoneCluster.ConnecterProcessReceive(...) - iPacketSize < PACKAGE_HEAD error!");

                    eventArgs.NetState.Dispose(); // 断开
                    return;
                }

                if (iReceiveBufferLength < iPacketSize)
                {
                                                          // 等待数据包的完整
                    break;
                }

                if (iPacketSize > BUFFER_SIZE)   // 数据包过大
                {
                    LOGs.WriteLine(LogMessageType.MSG_ERROR, "ZoneCluster.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, "ZoneCluster.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 = ZoneClusterPacketHandlers.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;
            }
        }