Session - ScutGame/Scut GitHub Wiki

此章节介绍服务端的Sesssion会话机制

Session概述

Session:称为“会话”,是指客户端与服务器交互通信时临时分配的身份信息凭证,它是有时效性的,在一定时间内没有访问后会过期删除,过期后如果客户端再访问时会重新分配新的Session。

在Scut服务器中提供GameSession类作为Session对象,客户端使用http/socket或websocket访问服务器时都会分配一个临时的GameSession对象,它的有效期是2个小时,如果间隔2个小时没有再访问时它会过期被删除; 客户端第一次访问时服务器会提供一个sessionId来标识一个GameSession对象,并返回给客户端,再次请求时客户端会将sessionId作为参数传给服务端,服务端会通过sessionId找到对应的GameSession对象,就不会再产生一个新的GameSession对象。

GameSession会话使用

在服务端项目中,每个Action接口都可以使用Current属性获得GameSession对象,来区分不同的玩家。

如何获得访问过服务器的所有玩家呢?

使用GameSession类可以获得,它包括有在线的玩家和不在线的玩家,代码如下:

List<GameSession> sessionList = GameSession.GetAll();

如何获得服务器中在线的所有玩家呢?

使用Socket长连接的情况比较特殊,它不能时时确定玩家的网络是连接的,因此我们需要通过客户端间隔一定时间(如:10s)发送一个心跳包给服务器来告诉服务器是连接成功的;

在使用GameSession类可以获得在线玩家时,需要提供发心跳包间隔时间参数,如果在这时间范围内客户端有再请求上来,我们认为玩家还是在线的;代码如下:

int delayTime = 10 * 1000; //10s
List<GameSession> sessionList = GameSession.GetOnlineAll(delayTime);

如何获得指定玩家的Session呢?

可以通过玩家的UserId获得,代码如下:

int userId = 1380001;
GameSession session = GameSession.Get(userId);

如何在玩家断线后处理些业务呢?

在MainClass类中可以重载OnHeartbeatTimeoutOnDisconnected两个方法,需要两个方法配合使用。

OnHeartbeatTimeout: 判断客户端发起的心跳包(30s发一次)是否有中断发送,需要设置GameSession.HeartbeatTimeout属性,当超过HeartbeatTimeout值还未收到客户端的心跳包,说明玩家已经下线,此方法就会被调用。

OnDisconnected: 当客户端发起close指令时,服务端收到后会触发调用此方法,可以及时处理玩家断线,但不包括未发close指令的。

public class MainClass
{
    protected override void OnHeartbeatTimeout(GameSession session)
    {
        //这里处理未收到close指令的断线业务
    }

    protected override void OnDisconnected(GameSession session)
    {
        //这里处理收到close指令的断线业务
    }
}