配置系统引导启动SuperScoekt

配置系统引导启动SuperScoekt

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既包含了这些工厂又包含了这些工厂所创建的实例,显得代码有些臃肿

当前标签: SuperSocket

 
SuperSocket源码解析之消息处理 cuit_igis 2016-06-28 16:23 阅读:318 评论:0  
 
SuperSocket源码解析之会话生命周期 cuit_igis 2016-06-27 21:13 阅读:65 评论:0  
 
SuperSocket源码解析之启动过程 cuit_igis 2016-06-27 17:06 阅读:233 评论:0  
 
SuperSocket源码解析之配置系统 cuit_igis 2016-06-26 22:36 阅读:294 评论:1  
 
SuperSocket源码解析之开篇 cuit_igis 2016-06-26 15:05 阅读:218 评论:0  
 
 
原文地址:https://www.cnblogs.com/Leo_wl/p/5634451.html