一 简介

这里主要说明从配置系统引导启动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源码解析之启动过程的更多相关文章

  1. Netty源码解析—客户端启动

    Netty源码解析-客户端启动 Bootstrap示例 public final class EchoClient { static final boolean SSL = System.getPro ...

  2. SuperSocket源码解析之开篇

    一 简介 官方介绍:SuperSocket 是一个轻量级, 跨平台而且可扩展的 .Net/Mono Socket 服务器程序框架.你无须了解如何使用 Socket, 如何维护 Socket 连接和 S ...

  3. SuperSocket源码解析之开篇 (转)

    一 简介 官方介绍:SuperSocket 是一个轻量级, 跨平台而且可扩展的 .Net/Mono Socket 服务器程序框架.你无须了解如何使用 Socket, 如何维护 Socket 连接和 S ...

  4. Nimbus<三>Storm源码分析--Nimbus启动过程

    Nimbus server, 首先从启动命令开始, 同样是使用storm命令"storm nimbus”来启动看下源码, 此处和上面client不同, jvmtype="-serv ...

  5. workerman源码分析之启动过程

    PHP一直以来以草根示人,它简单,易学,被大量应用于web开发,非常可惜的是大部分开发都在简单的增删改查,或者加上pdo,redis等客户端甚至分布式,以及规避语言本身的缺陷.然而这实在太委屈PHP了 ...

  6. mybatis源码分析:启动过程

    mybatis在开发中作为一个ORM框架使用的比较多,所谓ORM指的是Object Relation Mapping,直译过来就是对象关系映射,这个映射指的是java中的对象和数据库中的记录的映射,也 ...

  7. 【Kafka源码】KafkaController启动过程

    [TOC] 之前聊过了很多Kafka启动过程中的一些加载内容,也知道了broker可以分为很多的partition,每个partition内部也可以分为leader和follower,主从之间有数据的 ...

  8. 【Kafka源码】Kafka启动过程

    一般来说,我们是通过命令来启动kafka,但是命令的本质还是调用代码中的main方法,所以,我们重点看下启动类Kafka.源码下下来之后,我们也可以通过直接运行Kafka.scala中的main方法( ...

  9. SpringMVC源码解析-DispatcherServlet启动流程和初始化

    在使用springmvc框架,会在web.xml文件配置一个DispatcherServlet,这正是web容器开始初始化,同时会在建立自己的上下文来持有SpringMVC的bean对象. 先从Dis ...

随机推荐

  1. 去除List列表中反复值(稍作调整,也适合于List&lt;T&gt; 和 List&lt;?&gt;)

    方法一 循环元素删除 [c-sharp] view plaincopy public static void removeDuplicate(List list) { for ( int i = 0  ...

  2. SQL 语言划分

    从功能上划分,SQL 语言能够分为DDL,DML和DCL三大类. 1. DDL(Data Definition Language)     数据定义语言,用于定义和管理 SQL 数据库中的全部对象的语 ...

  3. c 输出9x9乘法口诀表 这个学for循环绕不开的一题

    #include<stdio.h> int main(void) { int i,j; ;i<=;i++) { ;j<=i;j++) { printf("%d*%d= ...

  4. js超简单日历

    用原生js写了一个超级简单的日历.当做是练习js中的Date类型. 思路: 获取某个日期,根据年份计算出每个月的天数. 利用Date中的getDay()知道该月份的第一天为星期几. 循环创建表格,显示 ...

  5. 用反射写自己的DataTable转为对应的Mod

    之前写过类似的方法,今天做项目的时候又遇到了,以前的代码没有保存,导致又得重新写 场景:当我们定义自己的很多模型(Mods)的时候,而数据库读取出来的却是DataSet,DataTable类型的时候, ...

  6. Expected stackmap frame at this location

    使用eclipse,本来使用的是jdk1.7的,后来切换到jdk1.8版本就出现了这个问题,报错的Reason说的是Expected stackmap frame at this location,其 ...

  7. BZOJ 1782: [Usaco2010 Feb]slowdown 慢慢游( BIT + dfs )

    orz...hzwer 对着大神的 code 看 , 稍微理解了. 考虑一只牛到达 , 那它所在子树全部 +1 , 可以用BIT维护 --------------------------------- ...

  8. Dojo实现Tabs页报错(三)

    用Dojo实现tab页的过程中,没有引用“on.js”,但是firebug调试时一直提示如下错误: on.js源码如下: define(["./has!dom-addeventlistene ...

  9. ThinkPHP第十一天(关联模型使用,独立分组配置,MySQL concat用法)

    1.关联模型的使用 定义方式:新建一个类文件UserRelationModel.class.php Class UserRelationModel extends RelationModel{ pro ...

  10. 【转载】CentsOS系统inotify实时监控服务器文件(夹)定制事件处理程序

    原始博文和参考博文 1.CentsOS系统inotify实时监控服务器文件 2.Linux中让进程在后台运行的方法 3.linux inotify 监控文件系统事件 非常好 方法一 说明: 服务器系统 ...