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

  • 相关阅读:
    前端iframe跨域传值笔记
    css 将第1/n行文本超出部分替换成省略号
    第一章:1-08、计算机网络中的主干网和本地接入网各有何特点?
    第一章:1-07、 计算机网络可从哪几个方面进行分类?
    第一章:1-06、 试将TCP/IP和OSI的体系结构进行比较。讨论其异同之处?
    第一章:1-05、试讨论在广播式网络中对网络层的处理方法。讨论是否需要这一层?
    第一章:1-04、为什么说因特网是自由印刷术以来人类通信方面最大的变革?
    第一章:1-03、试从多个方面比较电路交换、报文交换和分组交换的主要优缺点。
    第一章:1-02、试简述分组交换的要点。
    第一章:1-01、计算机网络的发展可划分为几个阶段?每个阶段各有何特点?
  • 原文地址:https://www.cnblogs.com/rjjs/p/5620722.html
Copyright © 2011-2022 走看看