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类中可以重载OnHeartbeatTimeout
和OnDisconnected
两个方法,需要两个方法配合使用。
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指令的断线业务
}
}