ServerStop - ScutGame/Scut GitHub Wiki

此章节介绍如何安全退出服务端程序

服务器安全退出

服务器以Console方式启动后, 如果Console执行完成后没有阻塞主线程就会直接退出,因此需要通过阻塞主线程的方式,让它处于等待休眠状态;

那么如何让阻塞的主线程退出来呢? 这里通过设置GameEnvironment的IsCanceled属性让主线程安装退出;退出时会先执行缓存Cache回写等操作会有一段等待时间。如下代码:


GameEnvironment.IsCanceled = true;

如何通过另外一个后台程序去管理游戏服务器的退出呢?

这里就需要用到服务器之间的通讯方式来处理,步骤如下:

(1) 先在游戏服务器的Script\CsScript\Remote目录下创建脚本名为Signout;


using ZyGames.Framework.Game.Runtime;
using ZyGames.Framework.Game.Service;
using ZyGames.Framework.RPC.IO;

namespace Game.Script.Remote
{
    public class Signout : RemoteStruct
    {
        public Signout(ActionGetter paramGetter, MessageStructure response)
            : base(paramGetter, response)
        {
        }

        protected override bool Check()
        {
            //较验请求,如允许内网IP访问
            return true;
        }

        protected override void TakeRemote()
        {
            var session = paramGetter.GetSession();
            if (session == null)
            {
                return;
            }

            GameEnvironment.IsCanceled = true;
        }

        protected override void BuildPacket()
        {
            //不返回
            //response.PushIntoStack("hello");
        }
    }
}

(2) 在另外一个后台程序中增加运行调用方法,如下:

如下服务器是Http的需要使用RemoteService.CreateHttpProxy方法创建客户端远程调用类,Socket则使用CreateTcpProxy的方法创建;

static void Test()
{
    var httpRemote = RemoteService.CreateHttpProxy("proxy1", "http://127.0.0.1/service.aspx");
    //不附加参数
    httpRemote.Call("Signout", new RequestParam() , result =>
    {
       //服务器不返回,这里就不处理数据了
    });
}