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 =>
{
//服务器不返回,这里就不处理数据了
});
}