Action - ScutGame/Scut GitHub Wiki

此章节介绍如何定义服务端的Action行为操作

Action层是接收客户端消息分发处理单元,每个Action处理单元处理指定的业务逻辑行为,以ActionId分发到指定的Action处理单元;每个Action处理单元都是GameStruct类的子类。

GameStruct类介绍

1. 如何获得客户端的数据

在GameStruct类中提供ActionGetter基类来获取客户端的数据;

  • 使用Scut的默认通讯协议,以ActionGetter的子类HttpGetter对象获得Get参数格式的数据;
  • 使用自定义通讯协议,需要继承ActionGetter类实现其中的方法来获取客户端的数据;
  • WebSocket通讯协议,获取也是使用HttpGetter对象;

2. 如何较验客户端数据

在GameStruct类中的ReadUrlElement方法处理较验逻辑,较验失败返回错误码和错误信息;在自己的Action子类中可以重载GetUrlElement(验证参数是否存在)和ValidateElement方法实现自己的逻辑验证。

3. 如何处理客户端的数据

在GameStruct类中提供DoAction方法处理数据,其中提供了三个可重载的方法:

  • CheckAction:可以处理些已登录的身份检查判断等
  • TakeAction:需要业务上实现处理逻辑
  • TakeActionAffter:处理完成后可以触发些事件处理

4. 如何将处理后的数据返回给客户端

Action处理单元的结果基本上是对象类型的数据,在GameStruct类的WriteResponse方法处理输出数据;

  • 使用Scut默认通讯协议,在BuildPacket方法处理,需要将对象的属性逐一增加到DataStruct对象的队列;提供int,string,bool,byte,byte[]等类型加入队列,详细查询API;
  • 使用自定义通讯协议,需要继承BinaryAction类重载BuildResponsePack方法;
  • WebSocket通讯协议,需要重载BuildJsonPack方法;

小提示:

  • 使用自定的通讯协议,中间件扩展方法可以通过重载GetUrlElement和WriteResponse方法;
  • 如果不想要将数据返回结客户端,设置IsNotRespond属性为True;

AuthorizeAction类介绍

此类负责身份判断,子类继承它时,就需要授权后才能访问,未授权的请求将不处理TakeAction方法;也可以配置IgnoreActionId属性为True,设置子类对象不需要授权就可以请求。

身份认证有以下几种状态(LoginStatus):

  • NoLogin: 未授权的状态;
  • Logined: 授权的User在其它地方登录了;
  • Success: 授权成功的状态;
  • Timeout: 授权超时,需要重新进行身份认证;

WebSocket通讯注意

  • 子类需要继承JsonAuthorizeAction类

LoginAction类介绍

此类是处理身份认证业务逻辑,子类通过重载CreateLogin方法,返回实现ILogin接口的认证逻辑类;默认是采用读取SnsCenter数据库验证用户名和密码的方式。

登录流程:

    1. 登录前,客户端的UID=0;
    1. 登录时,通过账号和密码获取UID,如果没有用户向用户中心(SnsCenter库)注册账号,产生UID给游戏服,再发给客户端;
    1. 创建角色前,客户端上传登录时拿到的UID;
    1. 创建角色时,RegisterAction会判断UID是否>0,如果失败则返回,成功则进行创建角色逻辑;