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