Пример #1
0
        protected ToolDlg(Kernel kernel, string nameTag, Object obj, string caption)
        {
            InitializeComponent();

            Kernel   = kernel;
            NameTag  = nameTag;
            _caption = caption;

            if (kernel.RunMode == RunMode.Remote)
            {
                sockTcp = (SockTcp)obj;
            }
            else
            {
                Server = (OneServer)obj;
            }

            Text = caption;

            //ウインドウサイズの復元
            kernel.WindowSize.Read(this);

            //MainMenuFile.Text = (kernel.IsJp()) ? "ファイル(&F)" : "&File";
            //MainMenuClose.Text = (kernel.IsJp()) ? "閉じる(&C)" : "&Close";
        }
Пример #2
0
        private readonly OneServer _v4Sv; //サーバ

        public TestServer(TestServerType type, String iniSubDir, String iniFileName)
        {
            var confName = type == TestServerType.Pop ? "Pop3" : "Smtp";

            //設定ファイルの退避と上書き
            _op = new TmpOption(iniSubDir, iniFileName);
            var kernel = new Kernel();
            var option = kernel.ListOption.Get(confName);
            var conf   = new Conf(option);


            //サーバ起動
            if (type == TestServerType.Pop)
            {
                _v4Sv = new Pop3Server.Server(kernel, conf, new OneBind(new Ip(IpKind.V4Localhost), ProtocolKind.Tcp));
                _v6Sv = new Pop3Server.Server(kernel, conf, new OneBind(new Ip(IpKind.V6Localhost), ProtocolKind.Tcp));
            }
            else
            {
                _v4Sv = new SmtpServer.Server(kernel, conf, new OneBind(new Ip(IpKind.V4Localhost), ProtocolKind.Tcp));
                _v6Sv = new SmtpServer.Server(kernel, conf, new OneBind(new Ip(IpKind.V6Localhost), ProtocolKind.Tcp));
            }
            _v4Sv.Start();
            _v6Sv.Start();

            Thread.Sleep(100); //少し余裕がないと多重でテストした場合に、サーバが起動しきらないうちにクライアントからの接続が始まってしまう。
        }
Пример #3
0
        public void AddWorldTest()
        {
            BaseWorld world = null; // TODO: 初始化为适当的值

            OneServer.AddWorld(world);
            Assert.Inconclusive("无法验证不返回值的方法。");
        }
Пример #4
0
        /// <summary>
        /// 表示线程池线程要执行的回调方法。
        /// </summary>
        /// <param name="state"></param>
        private void SliceWorld(object state)
        {
            if (OneServer.Closing == true)
            {
                Interlocked.Decrement(ref m_SignalCount);
                return;
            }

            // 运行库为每个可执行文件创建一个异常信息表。在异常信息表中,可执行文件的每个方法都有一个关联的异常处理信息数组(可以为空)。
            // 数组中的每一项描述一个受保护的代码块、任何与该代码关联的异常筛选器和任何异常处理程序(Catch 语句)。此异常表非常有效,
            // 在没有发生异常时,在处理器时间或内存使用上没有性能损失。仅在异常发生时使用资源。
            try
            {
                EventHandler <BaseWorldEventArgs> tempEventArgs = m_EventStartSlice;
                if (tempEventArgs != null)
                {
                    tempEventArgs(this, m_BaseWorldEventArgs);
                }

                // 更新ISupportSlice的处理
                m_SliceUpdate.Slice();

                // AI处理
                AISystem.Slice();

                // 时间片
                TimeSlice.Slice();

                // 测试下来在数组方面for内只使用一个索引数值的时候比foreach速度快,当超过使用两个索引数值时就比foreach慢了。
                // 其他方面foreach比较快
                MessagePump[] tempArray = m_MessagePump;
                for (int iIndex = 0; iIndex < tempArray.Length; iIndex++)
                {
                    tempArray[iIndex].Slice();
                }

                // 发送缓存的数据
                this.FlushAll();

                // 处理已经断开的连接
                this.ProcessDisposed();

                tempEventArgs = m_EventEndSlice;
                if (tempEventArgs != null)
                {
                    tempEventArgs(this, m_BaseWorldEventArgs);
                }

                // 最后需要等待的单处理执行
                m_WaitExecute.Slice();
            }
            catch (Exception exception)
            {
                OneServer.UnhandledException(this, new UnhandledExceptionEventArgs(exception, true));
            }
            finally
            {
                Interlocked.Decrement(ref m_SignalCount);
            }
        }
Пример #5
0
        public void UnhandledExceptionTest()
        {
            object sender = null;                         // TODO: 初始化为适当的值
            UnhandledExceptionEventArgs eventArgs = null; // TODO: 初始化为适当的值

            OneServer.UnhandledException(sender, eventArgs);
            Assert.Inconclusive("无法验证不返回值的方法。");
        }
Пример #6
0
        public void RunServerTest()
        {
            string[]  args     = null;  // TODO: 初始化为适当的值
            BaseWorld world    = null;  // TODO: 初始化为适当的值
            bool      expected = false; // TODO: 初始化为适当的值
            bool      actual;

            actual = OneServer.RunServer(args, world);
            Assert.AreEqual(expected, actual);
            Assert.Inconclusive("验证此测试方法的正确性。");
        }
Пример #7
0
        internal override void OnSyncServerTime(DateTime serverTime, int id)
        {
            if (id != lastSendHeartbeatSeqId)
            {
                Logs.Error("服务器同步时间有问题,id编号错误 {0} {1}", id.ToString(), lastSendHeartbeatSeqId.ToString());
                return;
            }

            lastRecvHeartbetaSeqId = id;

            //  服务器当前的时间可以视为服务器发过来的时间,再加上网络延迟
            //  网络延迟 = (当前时间 - 发送心跳包的时间) / 2
            var ts            = DateTime.Now - lastSendTime;
            var nowServerTime = serverTime.AddMilliseconds(ts.TotalMilliseconds / 2);

            OneServer.SetServerTime(nowServerTime);
        }
Пример #8
0
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        /// <param name="args"></param>
        private static void Main(string[] strArgs)
        {
            //////////////////////////////////////////////////////////////////////////
            // 初始化参数

            InitServerArguments(strArgs);

            //////////////////////////////////////////////////////////////////////////
            // 初始化一些工作

            OneServer.EventConfigServer   += new ConfigServerEventHandler(ProcessServer.ConfigServer);
            OneServer.EventInitOnceServer += new InitOnceServerEventHandler(ProcessServer.InitOnceServer);
            OneServer.EventExitServer     += new ExitServerEventHandler(ProcessServer.ExitServer);

            OneServer.EventCommandLineInfo     += new CommandLineInfoEventHandler(ProcessServer.CommandLineInfo);
            OneServer.EventCommandLineDisposal += new CommandLineDisposalEventHandler(ProcessServer.CommandLineDisposal);

            Program.RealmServerMessagePump.EventNetStateCreate += new EventHandler <NetStateInitEventArgs>(ProcessNet.RealmInitializeNetState);
            Program.RealmServerMessagePump.EventProcessReceive += new EventHandler <NetStateEventArgs>(ProcessNet.RealmProcessReceive);
            Program.RealmServerMessagePump.AddListener(Program.RealmServerListener);

            Program.AuthServerMessagePump.EventNetStateCreate += new EventHandler <NetStateInitEventArgs>(ProcessNet.AuthInitializeNetState);
            Program.AuthServerMessagePump.EventProcessReceive += new EventHandler <NetStateEventArgs>(ProcessNet.AuthProcessReceive);
            Program.AuthServerMessagePump.AddListener(Program.AuthServerListener);

            ProcessServer.WowZoneCluster.World.AddMessagePump(Program.RealmServerMessagePump);
            ProcessServer.WowZoneCluster.World.AddMessagePump(Program.AuthServerMessagePump);

            ProcessServer.WowZoneCluster.World.EventInitOnceWorld += new EventHandler <BaseWorldEventArgs>(ProcessServer.WowZoneCluster.World.InitOnceWorld);
            ProcessServer.WowZoneCluster.World.EventEndSlice      += new EventHandler <BaseWorldEventArgs>(ProcessServer.WowZoneCluster.World.WorldSlice);

            //////////////////////////////////////////////////////////////////////////
            // 开始运行服务

            OneServer.RunServer(strArgs, ProcessServer.WowZoneCluster.World);
        }
Пример #9
0
        //���j���[�I����̏���
        public void MenuOnClick(String cmd)
        {
            if (cmd.IndexOf("Option_") == 0)
            {
                if (RunMode == RunMode.Remote)
                {
                    //Java fix RunMOde==Remote�̏ꍇ�̃��j���[����
                    RemoteClient.MenuOnClick(cmd);
                }
                else
                {
                    var oneOption = ListOption.Get(cmd.Substring(7));
                    if (oneOption != null)
                    {
                        var dlg = new OptionDlg(this, oneOption);
                        if (DialogResult.OK == dlg.ShowDialog())
                        {
                            //Ver5.8.6 Java fix
                            //oneOption.Save(OptionIni.GetInstance());
                            oneOption.Save(IniDb);
                            MenuOnClick("StartStop_Reload");
                        }
                    }
                }
            }
            else if (cmd.IndexOf("Tool_") == 0)
            {
                if (RunMode == RunMode.Remote)
                {
                    //Java fix RunMOde==Remote�̏ꍇ�̃��j���[����
                    RemoteClient.MenuOnClick(cmd);
                }
                else
                {
                    var nameTag = cmd.Substring(5);
                    var oneTool = ListTool.Get(nameTag);
                    if (oneTool == null)
                    {
                        return;
                    }

                    //BJD.EXE�ȊO�̏ꍇ�A�T�[�o�I�u�W�F�N�g�ւ̃|�C���^���K�v�ɂȂ�
                    OneServer oneServer = null;
                    if (nameTag != "BJD")
                    {
                        oneServer = ListServer.Get(nameTag);
                        if (oneServer == null)
                        {
                            return;
                        }
                    }

                    ToolDlg dlg = oneTool.CreateDlg(oneServer);
                    dlg.ShowDialog();
                }
            }
            else if (cmd.IndexOf("StartStop_") == 0)
            {
                if (RunMode == RunMode.Remote)
                {
                    //Java fix RunMOde==Remote�̏ꍇ�̃��j���[����
                    RemoteClient.MenuOnClick(cmd);
                }
                else
                {
                    switch (cmd)
                    {
                    case "StartStop_Start":
                        Start();
                        break;

                    case "StartStop_Stop":
                        Stop();
                        break;

                    case "StartStop_Restart":
                        Stop();
                        Thread.Sleep(300);
                        Start();
                        break;

                    case "StartStop_Reload":
                        Stop();
                        ListInitialize();
                        Start();
                        break;

                    case "StartStop_Service":
                        SetupService();     //�T�[�r�X�̐ݒ�
                        break;

                    default:
                        Util.RuntimeException(string.Format("cmd={0}", cmd));
                        break;
                    }
                    View.SetColor();  //�E�C���h�̃J���[������
                    Menu.SetEnable(); //��Ԃɉ������L���E����
                }
            }
            else
            {
                switch (cmd)
                {
                case "File_LogClear":
                    LogView.Clear();
                    break;

                case "File_LogCopy":
                    LogView.SetClipboard();
                    break;

                case "File_Trace":
                    TraceDlg.Open();
                    break;

                case "File_Exit":
                    View.MainForm.Close();
                    break;

                case "Help_Version":
                    var dlg = new VersionDlg(this);
                    dlg.ShowDialog();
                    break;

                case "Help_Homepage":
                    Process.Start(Define.WebHome());
                    break;

                case "Help_Document":
                    Process.Start(Define.WebDocument());
                    break;

                case "Help_Support":
                    Process.Start(Define.WebSupport());
                    break;
                }
            }
        }
Пример #10
0
        /// <summary>
        /// 运行时间片(具有均衡负载的时间片处理)
        /// </summary>
        internal static void Slice()
        {
            bool bIsSliceOK = false;

            do
            {
                // 总是先处理完高优先级
                if (s_CallHighestCount < CALL_SLICE_MAX_COUNT)
                {
                    bIsSliceOK = Slice_Highest();
                    if (bIsSliceOK == true)
                    {
                        s_CallHighestCount++;
                        break;
                    }
                }

                if (s_CallAboveNormalCount < CALL_SLICE_MAX_COUNT)
                {
                    bIsSliceOK = Slice_AboveNormal();
                    if (bIsSliceOK == true)
                    {
                        s_CallAboveNormalCount++;
                        break;
                    }
                }

                if (s_CallNormalCount < CALL_SLICE_MAX_COUNT)
                {
                    bIsSliceOK = Slice_Normal();
                    if (bIsSliceOK == true)
                    {
                        s_CallNormalCount++;
                        break;
                    }
                }

                if (s_CallBelowNormalCount < CALL_SLICE_MAX_COUNT)
                {
                    bIsSliceOK = Slice_BelowNormal();
                    if (bIsSliceOK == true)
                    {
                        s_CallBelowNormalCount++;
                        break;
                    }
                }

                if (s_CallLowestCount < CALL_SLICE_MAX_COUNT)
                {
                    bIsSliceOK = Slice_Lowest();
                    if (bIsSliceOK == true)
                    {
                        s_CallLowestCount++;
                        break;
                    }
                }

                // 如果没有需要处理的则再检测调用的次数是否已满
                if (s_CallHighestCount >= CALL_SLICE_MAX_COUNT)
                {
                    s_CallHighestCount = 0;

                    bIsSliceOK = Slice_Highest();
                    if (bIsSliceOK == true)
                    {
                        break;
                    }
                }

                if (s_CallAboveNormalCount >= CALL_SLICE_MAX_COUNT)
                {
                    s_CallAboveNormalCount = 0;

                    bIsSliceOK = Slice_AboveNormal();
                    if (bIsSliceOK == true)
                    {
                        break;
                    }
                }

                if (s_CallNormalCount >= CALL_SLICE_MAX_COUNT)
                {
                    s_CallNormalCount = 0;

                    bIsSliceOK = Slice_Normal();
                    if (bIsSliceOK == true)
                    {
                        break;
                    }
                }

                if (s_CallBelowNormalCount >= CALL_SLICE_MAX_COUNT)
                {
                    s_CallBelowNormalCount = 0;

                    bIsSliceOK = Slice_BelowNormal();
                    if (bIsSliceOK == true)
                    {
                        break;
                    }
                }

                if (s_CallLowestCount >= CALL_SLICE_MAX_COUNT)
                {
                    s_CallLowestCount = 0;

                    bIsSliceOK = Slice_Lowest();
                    if (bIsSliceOK == true)
                    {
                        break;
                    }
                }
            } while (false);

            if (bIsSliceOK == true)
            {
                // 如果已经处理完,再发一次事件消息,让下一个线程来处理下一个时间片优先级的调用
                OneServer.SetAllWorldSignal();
            }
        }
Пример #11
0
        /// <summary>
        /// Timer的主要处理函数,用来计算是否需要处理的时候了
        /// </summary>
        private static void RunMobileAIThread()
        {
            // 向服务程序注册有新的线程在内部运行
            OneServer.BeginRegisterThread();

            LOGs.WriteLine(LogMessageType.MSG_INFO, "AI系统: 处理AI系统的主线程已启动!");

            //long l_iIndex = 0;
            bool     l_bLoaded     = false;
            DateTime l_nowDateTime = DateTime.Now;

            while (OneServer.Closing == false)
            {
                s_Signal.WaitOne(10, false);

                // 服务已经关闭则退出
                if (OneServer.Closing)
                {
                    break;
                }

                // 百分比输出显示
                if (s_IsDumpInfo)
                {
                    s_IsDumpInfo = false;
                    InternalDumpInfo();
                }

                // 先处理改变了优先级的时间片集合
                ProcessChangeQueue();

                l_bLoaded = false;

                //// 8种时间片
                //for ( l_iIndex = 0; l_iIndex < 8; l_iIndex++ )
                //{
                //    l_nowDateTime = DateTime.Now;

                //    // 如果小于下一次处理的时间片就跳出
                //    if ( l_nowDateTime < s_NextPriorities[l_iIndex] )
                //        break;

                //    // 设置下一次处理的时间片
                //    s_NextPriorities[l_iIndex] = l_nowDateTime + s_PriorityDelays[l_iIndex];

                //    foreach ( TimeSlice timeSlice in s_Timers[l_iIndex] )
                //    {
                //        // 如果当前时间片已经处理过,已不在先入先出的集合中,并且当前的时间大于下一次调用的时间
                //        if ( timeSlice.InQueued == false && l_nowDateTime > timeSlice.NextTime )
                //        {
                //            // 表示将当前的时间片已经加入先入先出集合中
                //            TimeSlice.JoinProcessQueue( timeSlice );

                //            l_bLoaded = true;

                //            // 如果运行次数大于等于当前的时间片的运行数量话就停止(如果只运行一次的话就马上调用停止,下次运行将从列表中移去,因为已经加入了TimeSlice.s_TimeSliceQueue集合所以会调用一次的)
                //            if ( timeSlice.Count != 0 && ( timeSlice.SetAdding( timeSlice.Adding + 1 ) >= timeSlice.Count ) )
                //                timeSlice.Stop();
                //            else
                //                timeSlice.SetNextTime( l_nowDateTime + timeSlice.IntervalTime ); // 计算下次调用的时间
                //        }
                //    }
                //}

                if (l_bLoaded)
                {
                    OneServer.SetAllWorldSignal();
                }
            }

            // 向服务程序注册创建的新线程已结束
            OneServer.EndRegisterThread();
        }
Пример #12
0
        //メニュー選択時の処理
        public void MenuOnClick(String cmd)
        {
            if (cmd.IndexOf("Option_") == 0)
            {
                if (RunMode == RunMode.Remote)
                {
                    //Java fix RunMOde==Remoteの場合のメニュー処理
                    RemoteClient.MenuOnClick(cmd);
                }
                else
                {
                    var oneOption = ListOption.Get(cmd.Substring(7));
                    if (oneOption != null)
                    {
                        var dlg = new OptionDlg(this, oneOption);
                        if (DialogResult.OK == dlg.ShowDialog())
                        {
                            //Ver5.8.6 Java fix
                            //oneOption.Save(OptionIni.GetInstance());
                            oneOption.Save(IniDb);
                            MenuOnClick("StartStop_Reload");
                        }
                    }
                }
            }
            else if (cmd.IndexOf("Tool_") == 0)
            {
                if (RunMode == RunMode.Remote)
                {
                    //Java fix RunMOde==Remoteの場合のメニュー処理
                    RemoteClient.MenuOnClick(cmd);
                }
                else
                {
                    var nameTag = cmd.Substring(5);
                    var oneTool = ListTool.Get(nameTag);
                    if (oneTool == null)
                    {
                        return;
                    }

                    //BJD.EXE以外の場合、サーバオブジェクトへのポインタが必要になる
                    OneServer oneServer = null;
                    if (nameTag != "BJD")
                    {
                        oneServer = ListServer.Get(nameTag);
                        if (oneServer == null)
                        {
                            return;
                        }
                    }

                    ToolDlg dlg = oneTool.CreateDlg(oneServer);
                    dlg.ShowDialog();
                }
            }
            else if (cmd.IndexOf("StartStop_") == 0)
            {
                if (RunMode == RunMode.Remote)
                {
                    //Java fix RunMOde==Remoteの場合のメニュー処理
                    RemoteClient.MenuOnClick(cmd);
                }
                else
                {
                    switch (cmd)
                    {
                    case "StartStop_Start":
                        Start();
                        break;

                    case "StartStop_Stop":
                        Stop();
                        break;

                    case "StartStop_Restart":
                        Stop();
                        Thread.Sleep(300);
                        Start();
                        break;

                    case "StartStop_Reload":
                        Stop();
                        ListInitialize();
                        Start();
                        break;

                    case "StartStop_Service":
                        SetupService();     //サービスの設定
                        break;

                    default:
                        Util.RuntimeException(string.Format("cmd={0}", cmd));
                        break;
                    }
                    View.SetColor();  //ウインドのカラー初期化
                    Menu.SetEnable(); //状態に応じた有効・無効
                }
            }
            else
            {
                switch (cmd)
                {
                case "File_LogClear":
                    LogView.Clear();
                    break;

                case "File_LogCopy":
                    LogView.SetClipboard();
                    break;

                case "File_Trace":
                    TraceDlg.Open();
                    break;

                case "File_Exit":
                    View.MainForm.Close();
                    break;

                case "Help_Version":
                    var dlg = new VersionDlg(this);
                    dlg.ShowDialog();
                    break;

                case "Help_Homepage":
                    Process.Start(Define.WebHome());
                    break;

                case "Help_Document":
                    Process.Start(Define.WebDocument());
                    break;

                case "Help_Support":
                    Process.Start(Define.WebSupport());
                    break;
                }
            }
        }
Пример #13
0
        /// <summary>
        /// Timer的主要处理函数,用来计算是否需要处理的时候了
        /// </summary>
        private static void RunTimerThread()
        {
            // 向服务程序注册有新的线程在内部运行
            OneServer.BeginRegisterThread();

            LOGs.WriteLine(LogMessageType.MSG_INFO, LanguageString.SingletonInstance.TimerThreadString007);

            long     iIndex      = 0;
            bool     bLoaded     = false;
            DateTime nowDateTime = DateTime.Now;

            while (OneServer.Closing == false)
            {
                s_Signal.WaitOne(10, false);

                // 服务已经关闭则退出
                if (OneServer.Closing == true)
                {
                    break;
                }

                // 百分比输出显示
                if (s_IsDumpInfo == true)
                {
                    s_IsDumpInfo = false;
                    InternalDumpInfo();
                }

                // 先处理改变了优先级的时间片集合
                ProcessChangeQueue();

                bLoaded = false;

                // 8种时间片
                for (iIndex = 0; iIndex < 8; iIndex++)
                {
                    nowDateTime = DateTime.Now;

                    // 如果小于下一次处理的时间片就跳出
                    if (nowDateTime < s_NextPriorities[iIndex])
                    {
                        break;
                    }

                    // 设置下一次处理的时间片
                    s_NextPriorities[iIndex] = nowDateTime + s_PriorityDelays[iIndex];

                    foreach (KeyValuePair <TimeSlice, TimeSlice> timeSlice in s_Timers[iIndex])
                    {
                        // 如果当前时间片已经处理过,已不在先入先出的集合中,并且当前的时间大于下一次调用的时间
                        if (timeSlice.Value.InQueued == false && nowDateTime > timeSlice.Value.NextTime)
                        {
                            // 表示将当前的时间片已经加入先入先出集合中
                            TimeSlice.JoinProcessQueue(timeSlice.Value);

                            bLoaded = true;

                            // 如果运行次数大于等于当前的时间片的运行数量话就停止(如果只运行一次的话就马上调用停止,下次运行将从列表中移去,因为已经加入了TimeSlice.s_TimeSliceQueue集合所以会调用一次的)
                            if (timeSlice.Value.Count != 0 && ++timeSlice.Value.Adding >= timeSlice.Value.Count)
                            {
                                timeSlice.Value.Stop();
                            }
                            else
                            {
                                timeSlice.Value.NextTime = nowDateTime + timeSlice.Value.IntervalTime; // 计算下次调用的时间
                            }
                        }
                    }
                }

                if (bLoaded == true)
                {
                    OneServer.SetAllWorldSignal();
                }
            }

            // 向服务程序注册创建的新线程已结束
            OneServer.EndRegisterThread();
        }
Пример #14
0
 public void BeginRegisterThreadTest()
 {
     OneServer.BeginRegisterThread();
     Assert.Inconclusive("无法验证不返回值的方法。");
 }
Пример #15
0
 public void SetAllWorldSignalTest()
 {
     OneServer.SetAllWorldSignal();
     Assert.Inconclusive("无法验证不返回值的方法。");
 }