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的關閉,回收會話相關資源,代理等至此一次完整的會話週期完成

相關文章
相關標籤/搜索