zoukankan      html  css  js  c++  java
  • 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既包含了这些工厂又包含了这些工厂所创建的实例,显得代码有些臃肿

  • 相关阅读:
    ZOJ 2588 Burning Bridges
    POJ 1966 ZOJ 2182 Cable TV Network
    HDU 5348 MZL's endless loop
    HDU 5352 MZL's City
    Tarjan算法求解无向连通图的割点、割边、点双连通分量和边双连通分量的模板
    ZOJ 1119 SPF
    HDU 3452 Bonsai
    HDU 1520 Anniversary party
    POJ 2239 Selecting Courses
    POJ 1144 Network
  • 原文地址:https://www.cnblogs.com/rjjs/p/5620722.html
Copyright © 2011-2022 走看看