SuperSocket源码解析之会话生命周期

一 基本概念

   会话(Session)是客户端与服务器进行通讯的基本单元,也是一个Socket的封装,在http协议中也有Session机制,其主要做用封装一个通讯单元socket,负责服务器与客户端消息发送与接收,会话之间相互独立互不干扰且拥有惟一SessionId标识,维护着客户与服务器通讯的生命周期。服务器

二 SocketSession

SocketSession是SuperSocket创建在消息收发层的会话,其主要做用在于客户与服务器通讯,其生命周期主要由建立,初始化,启动,运行,关闭过程组成;session

2.1 建立

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

var session = CreateSession(client, socketSession);

//很大缘由在于被链接过滤掉了这个地址,因此把拿出来的资源重置后在压入链接栈,并关闭端口
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 

 

 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的关闭,回收会话相关资源,代理等至此一次完整的会话周期完成

相关文章
相关标签/搜索