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源码解析之启动过程的更多相关文章
- Netty源码解析—客户端启动
Netty源码解析-客户端启动 Bootstrap示例 public final class EchoClient { static final boolean SSL = System.getPro ...
- SuperSocket源码解析之开篇
一 简介 官方介绍:SuperSocket 是一个轻量级, 跨平台而且可扩展的 .Net/Mono Socket 服务器程序框架.你无须了解如何使用 Socket, 如何维护 Socket 连接和 S ...
- SuperSocket源码解析之开篇 (转)
一 简介 官方介绍:SuperSocket 是一个轻量级, 跨平台而且可扩展的 .Net/Mono Socket 服务器程序框架.你无须了解如何使用 Socket, 如何维护 Socket 连接和 S ...
- Nimbus<三>Storm源码分析--Nimbus启动过程
Nimbus server, 首先从启动命令开始, 同样是使用storm命令"storm nimbus”来启动看下源码, 此处和上面client不同, jvmtype="-serv ...
- workerman源码分析之启动过程
PHP一直以来以草根示人,它简单,易学,被大量应用于web开发,非常可惜的是大部分开发都在简单的增删改查,或者加上pdo,redis等客户端甚至分布式,以及规避语言本身的缺陷.然而这实在太委屈PHP了 ...
- mybatis源码分析:启动过程
mybatis在开发中作为一个ORM框架使用的比较多,所谓ORM指的是Object Relation Mapping,直译过来就是对象关系映射,这个映射指的是java中的对象和数据库中的记录的映射,也 ...
- 【Kafka源码】KafkaController启动过程
[TOC] 之前聊过了很多Kafka启动过程中的一些加载内容,也知道了broker可以分为很多的partition,每个partition内部也可以分为leader和follower,主从之间有数据的 ...
- 【Kafka源码】Kafka启动过程
一般来说,我们是通过命令来启动kafka,但是命令的本质还是调用代码中的main方法,所以,我们重点看下启动类Kafka.源码下下来之后,我们也可以通过直接运行Kafka.scala中的main方法( ...
- SpringMVC源码解析-DispatcherServlet启动流程和初始化
在使用springmvc框架,会在web.xml文件配置一个DispatcherServlet,这正是web容器开始初始化,同时会在建立自己的上下文来持有SpringMVC的bean对象. 先从Dis ...
随机推荐
- js中赋值表达式的值为右边
var name="the window";var o={ name:"the object", getName:function(){ console.log ...
- 页面布局之BFC 微微有点坑
一.什么是BFC: 在解释 BFC 是什么之前,需要先介绍 Box.Formatting Context的概念. Box: CSS布局的基本单位 Box 是 CSS 布局的对象和基本单位, 直观点来说 ...
- UILabel显示html文本
NSString * htmlString = @"<html><body> Some html string \n <font size=\"13\ ...
- ubuntu中彻底删除nginx
1.先执行一下命令: 1.1 删除nginx,–purge包括配置文件 sudo apt-get --purge remove nginx 1.2 自动移除全部不使用的软件包 sudo apt-get ...
- C3P0连接池参数解释
<!--acquireIncrement:链接用完了自动增量3个. --> <property name="acquireIncrement">3</ ...
- HDU 1222 Wolf and Rabbit(gcd)
HDU 1222 Wolf and Rabbit (最大公约数)解题报告 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...
- ASP.NET 导入excel 数据
1,需要给上传文件的目录给予权限 2. <asp:FileUpload ID="FileUpload1" runat="server" /> < ...
- POJ 3518 Prime Gap(素数题)
[题意简述]:输入一个数,假设这个数是素数就输出0,假设不是素数就输出离它近期的两个素数的差值,叫做Prime Gap. [分析]:这题过得非常险.由于我是打的素数表. 由于最大的素数是1299709 ...
- android -- 蓝牙 bluetooth (三)搜索蓝牙
接上篇打开蓝牙继续,来一起看下蓝牙搜索的流程,触发蓝牙搜索的条件形式上有两种,一是在蓝牙设置界面开启蓝牙会直接开始搜索,另一个是先打开蓝牙开关在进入蓝牙设置界面也会触发搜索,也可能还有其它触发方式,但 ...
- ThinkPHP - 加载第三方类库
目录结构: 将核心的第三方目录放置在Apps下的Core目录中. 这样其他控制器便可以轻松访问. *为什么不直接放在ThinkPHP框架既有的第三方文件夹中,答案是便于升级,升级TP版本时,可直接替换 ...