SuperSocket源碼解析之啟動過程


 

一 簡介

   這里主要說明從配置系統引導啟動SuperScoekt作為應用程序,且以控制台程序方式啟動

二 啟動過程

 

 2.1 配置解析

 

 

從讀取配置文件開始,直接拿到一個SocketServiceConfig對象,這個類型封裝了SuperSocket的所有配置,其主要包含了一下參數

1)服務器根配置

配置節點 "superSocket" SuperSocket 配置的根節點,它定義了 SuperSocket 所需要的全局參數。 讓我們先看下根節點的所有配置屬性:

  • maxWorkingThreads: 線程池最大工作線程數量;
  • minWorkingThreads: 線程池最小工作線程數量;
  • maxCompletionPortThreads: 線程池最大完成端口線程數量;
  • minCompletionPortThreads: 線程池最小完成端口線程數量;
  • disablePerformanceDataCollector: 是否禁用性能數據采集;
  • performanceDataCollectInterval: 性能數據采集頻率 (單位為秒, 默認值: 60);
  • isolation: SuperSocket 服務器實例隔離級別
    • None - 無隔離
    • AppDomain - 應用程序域級別的隔離,多個服務器實例運行在各自獨立的應用程序域之中
    • Process - 進程級別的隔離,多個服務器實例運行在各自獨立的進程之中
  • logFactory: 默認logFactory的名字, 所有可用的 log factories定義在子節點 "logFactories" 之中, 我們將會在下面的文檔中介紹它;
  • defaultCulture: 整個程序的默認 thread culture,只在.Net 4.5中可用;

 示例:

<superSocket maxWorkingThreads="50" minWorkingThreads="10">
        <servers>
            <server name="TelnetServerA"
                    serverTypeName="TelnetServer"
                    ip="Any"
                    port="2020">
            </server>
            <server name="TelnetServerB"
                    serverTypeName="TelnetServer"
                    ip="Any"
                    port="2021">
            </server>
        </servers>
        <serverTypes>
            <add name="TelnetServer"
                 type="SuperSocket.QuickStart.TelnetServer_StartByConfig.TelnetServer, SuperSocket.QuickStart.TelnetServer_StartByConfig"/>
        </serverTypes>
    </superSocket>

 

 2) 服務實例配置

   <servers>
            <server name="TelnetServerA"
                    serverTypeName="TelnetServer"
                    ip="Any"
                    port="2020">
            </server>
            <server name="TelnetServerB"
                    serverTypeName="TelnetServer"
                    ip="Any"
                    port="2021">
            </server>
        </servers>

 3)所有類型配置

 主要有: 日志類型工廠,連接過濾類型工廠,命令加載類型工廠,協議解析類型工廠

 

4)關鍵代碼

這里的InitializeProviderFactories方法則是將形如

<serverTypes>
            <add name="TelnetServer"
                 type="SuperSocket.QuickStart.TelnetServer_StartByConfig.TelnetServer, SuperSocket.QuickStart.TelnetServer_StartByConfig"/>
        </serverTypes>
之類的配置解析成TypeProviderCollection的集合,其子類型為TypeProvider,包含name和type兩個屬性

 2.2 創建AppServer

 

其中CreateWorkItemInstance方法是將AppServer以反射方式實例化,僅此而已,重點在SetupWorkItemInstance,該方法使得AppServer所有配置得到初始化,而直接進入AppServer關鍵函數Setup

 

2.3 創建並初始化

1) 設置AppServer所需並發依賴的線程池設置:SetupBasic方法

      默認的線程池最大最小是CLR的設置

      默認將采用TextEncoding = new ASCIIEncoding();編碼方式

2) 設置AppServer所需要的日志組件:SetupLogFactory

3) 初始化AppServer關聯的ConnectFilter:

4) 初始化AppServer關聯的命令加載器:SetupMedium,默認的命令加載器器

5)初始化AppServer安全證書,監聽器,構建命令等SetupAdvanced 

6) Setup用於子類重寫

7)初始化SocketServer和默認的協議解析為服務啟動做好最后准備:SetupFinal

 

2.4 啟動

其實AppServer啟動本質是把SocketServer啟動起來,將服務器監聽Socket實例化並進入監聽狀態,並觸發AppServer啟動事件;而SocketServer則需要根據配置設定最大連接數,接收緩沖區初始化,准備好IOCP代理SocketAsyncEventArgs,以及發送隊列,自此SuperSocket已進入工作狀態。

 

在這個短長的啟動過程中配置部分占據了一大部分代碼,而加之工廠模式大量使用導致配置解析過程變得相對復雜,而AppServer本身就是有工廠創建,

對於AppServer的實例來說AppServer本身的配套的相關組件(日志,連接過濾,命令,解析等)就夠了

而不是還直接引用着這些配套組件的工廠,這樣使得AppServer既包含了這些工廠又包含了這些工廠所創建的實例,顯得代碼有些臃腫

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM