一 基本概念
会话(Session)是客户端与服务器进行通信的基本单元,也是一个Socket的封装,在http协议中也有Session机制,其主要作用封装一个通信单元socket,负责服务器与客户端消息发送与接收,会话之间相互独立互不干扰且拥有唯一SessionId标识,维护着客户与服务器通信的生命周期。
二 SocketSession
SocketSession是SuperSocket建立在消息收发层的会话,其主要作用在于客户与服务器通信,其生命周期主要由创建,初始化,启动,运行,关闭过程组成;
2.1 创建
SocketSession的创建源于服务器监听端口接收到一个客户端连接请求,取出该连接的Socket触发新客户端请求事件,且看代码
private IAppSession ProcessNewClient(Socket client, SslProtocols security)
{
//取出预先准备好的SocketAsyncEventArgsProxy代理
SocketAsyncEventArgsProxy socketEventArgsProxy;
if (!m_ReadWritePool.TryPop(out socketEventArgsProxy))
{
AppServer.AsyncRun(client.SafeClose);
if (AppServer.Logger.IsErrorEnabled)
AppServer.Logger.ErrorFormat("Max connection number {0} was reached!", AppServer.Config.MaxConnectionNumber);
return null;
}
ISocketSession socketSession;
if (security == SslProtocols.None)
socketSession = new AsyncSocketSession(client, socketEventArgsProxy);
else
socketSession = new AsyncStreamSocketSession(client, security, socketEventArgsProxy);
var session = CreateSession(client, socketSession);
//很大原因在于被连接过滤掉了这个地址,所以把拿出来的资源重置后在压入连接栈,并关闭端口
if (session == null)
{
socketEventArgsProxy.Reset();
this.m_ReadWritePool.Push(socketEventArgsProxy);
AppServer.AsyncRun(client.SafeClose);
return null;
}
socketSession.Closed += SessionClosed;
var negotiateSession = socketSession as INegotiateSocketSession;
if (negotiateSession == null)
{
if (RegisterSession(session))
{
AppServer.AsyncRun(() => socketSession.Start());
}
return session;
}
negotiateSession.NegotiateCompleted += OnSocketSessionNegotiateCompleted;
negotiateSession.Negotiate();
return null;
}
1)每一个客户端Socket都将交由SocketAsyncEventArgsProxy代理托管,该代理主要用着socket连接是否断开判断;
2)首先创建一个SocketSession实例,将该实例作为AppSession创建的参数;
3)创建AppSession
2.2 初始化AppSession
1) 初始化SocketSession和SocketAsyncProxy代理
在初始化SocketSession过程中主要完成了 发送队列参数和代理设置;
2)SocketAsyncProxy代理初始化
当连接断开时将触发接收一次消息,即Socket最后一次操作处理将触发Socket是否断开验证,从而触发Session关闭
2.3 启动会话
这里将Start方法交给一个Task并行执行任务执行,也就是托管在线程池中,并处理Task终止异常;自此SocketSession将开始工作接收客户端发送的消息
2.4 工作
其工作模式为:开始接收数据包,接收完成后交给AppSession处理该数据包,进而继续接收数据,此过程均是同步进行
2.5 会话关闭
首先会话关闭也就是Socket连接断开的原因有很多,如客户端主动断开,或者服务器过滤掉该会话,或者消息收发异常及其他严重异常也将导致该会话关闭终止,且看如何处理Socket的终止,
1)接收验证
首先在Socket上下文代理SocketAsyncProxy中将处理Socket最后一次接收,在每一次处理接收消息是将验证处理的数据包谁否完成,将验证该Socket连接的有效性,如图所示,如果没有任务数据包传输则判定该Socket失效,将关闭该会话
2)发送验证
如果发送的数据包为0那么也认定该Socket失效导致Session关闭
3)关闭Session
SocketSession的关闭将触发AppServer会话关闭事件,进而触发AppSession的关闭,回收会话相关资源,代理等至此一次完整的会话周期完成