会话(Session)是客户端与服务器进行通讯的基本单元,也是一个Socket的封装,在http协议中也有Session机制,其主要做用封装一个通讯单元socket,负责服务器与客户端消息发送与接收,会话之间相互独立互不干扰且拥有惟一SessionId标识,维护着客户与服务器通讯的生命周期。服务器
SocketSession是SuperSocket创建在消息收发层的会话,其主要做用在于客户与服务器通讯,其生命周期主要由建立,初始化,启动,运行,关闭过程组成;session
SocketSession的建立源于服务器监听端口接收到一个客户端链接请求,取出该链接的Socket触发新客户端请求事件,且看代码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);this
return null;
}spa
ISocketSession socketSession;线程
if (security == SslProtocols.None)
socketSession = new AsyncSocketSession(client, socketEventArgsProxy);
else
socketSession = new AsyncStreamSocketSession(client, security, socketEventArgsProxy);3d
//很大缘由在于被链接过滤掉了这个地址,因此把拿出来的资源重置后在压入链接栈,并关闭端口
if (session == null)
{
socketEventArgsProxy.Reset();
this.m_ReadWritePool.Push(socketEventArgsProxy);
AppServer.AsyncRun(client.SafeClose);
return null;
}代理
socketSession.Closed += SessionClosed;orm
var negotiateSession = socketSession as INegotiateSocketSession;blog
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
1) 初始化SocketSession和SocketAsyncProxy代理
在初始化SocketSession过程当中主要完成了 发送队列参数和代理设置;
2)SocketAsyncProxy代理初始化
当链接断开时将触发接收一次消息,即Socket最后一次操做处理将触发Socket是否断开验证,从而触发Session关闭
这里将Start方法交给一个Task并行执行任务执行,也就是托管在线程池中,并处理Task终止异常;自此SocketSession将开始工做接收客户端发送的消息
其工做模式为:开始接收数据包,接收完成后交给AppSession处理该数据包,进而继续接收数据,此过程均是同步进行
首先会话关闭也就是Socket链接断开的缘由有不少,如客户端主动断开,或者服务器过滤掉该会话,或者消息收发异常及其余严重异常也将致使该会话关闭终止,且看如何处理Socket的终止,
1)接收验证
首先在Socket上下文代理SocketAsyncProxy中将处理Socket最后一次接收,在每一次处理接收消息是将验证处理的数据包谁否完成,将验证该Socket链接的有效性,如图所示,若是没有任务数据包传输则断定该Socket失效,将关闭该会话
2)发送验证
若是发送的数据包为0那么也认定该Socket失效致使Session关闭
3)关闭Session
SocketSession的关闭将触发AppServer会话关闭事件,进而触发AppSession的关闭,回收会话相关资源,代理等至此一次完整的会话周期完成