一 簡介
這里主要說明從配置系統引導啟動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既包含了這些工廠又包含了這些工廠所創建的實例,顯得代碼有些臃腫