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

  • 相关阅读:
    【转】Java集合框架面试问题集锦
    【转】Hibernate面试问题集锦: 概述
    【转】常见Java面试题 – 第四部分:迭代(iteration)和递归(recursion)
    【转】常见Java面试题 – 第三部分:重载(overloading)与重写(overriding)
    【转】常见Java面试题 – 第二部分:equals与==
    【转】常见Java面试题 – 第一部分:非可变性(Immutability)和对象引用(Object reference)
    【转】你应该关注的几个Eclipse超酷插件
    【转】Eclipse插件收藏列表
    【转】最受欢迎的8位Java牛人
    【转】改进异常处理的6条建议
  • 原文地址:https://www.cnblogs.com/rjjs/p/5620722.html
Copyright © 2011-2022 走看看