SuperSocket中的Server是如何初Initialize的
第一个函数
d:\sourcecode\github\supersocket\quickstart\basic\telnetserver_startbyconfig\program.cs
static void Main(string[] args)
{
Console.WriteLine("Press any key to start the server!"); Console.ReadKey();
Console.WriteLine(); var bootstrap = BootstrapFactory.CreateBootstrap(); if (!bootstrap.Initialize())
{
Console.WriteLine("Failed to initialize!");
Console.ReadKey();
return;
} var result = bootstrap.Start(); Console.WriteLine("Start result: {0}!", result); if (result == StartResult.Failed)
{
Console.WriteLine("Failed to start!");
Console.ReadKey();
return;
} Console.WriteLine("Press key 'q' to stop it!"); while (Console.ReadKey().KeyChar != 'q')
{
Console.WriteLine();
continue;
} Console.WriteLine(); //Stop the appServer
bootstrap.Stop(); Console.WriteLine("The server was stopped!");
}
第二个函数
d:\sourcecode\github\supersocket\socketengine\defaultbootstrap.cs
/// <summary>
/// Initializes the bootstrap with the configuration
/// </summary>
/// <returns></returns>
public virtual bool Initialize()
{
return Initialize(c => c);
}
第三个函数
d:\sourcecode\github\supersocket\socketengine\defaultbootstrap.cs
/// <summary>
/// Initializes the bootstrap with the configuration and config resolver.
/// </summary>
/// <param name="serverConfigResolver">The server config resolver.</param>
/// <returns></returns>
public virtual bool Initialize(Func<IServerConfig, IServerConfig> serverConfigResolver)
{
return Initialize(serverConfigResolver, null);
}
第四个函数
d:\sourcecode\github\supersocket\socketengine\defaultbootstrap.cs
/// <summary>
/// Initializes the bootstrap with the configuration, config resolver and log factory.
/// </summary>
/// <param name="serverConfigResolver">The server config resolver.</param>
/// <param name="logFactory">The log factory.</param>
/// <returns></returns>
public virtual bool Initialize(Func<IServerConfig, IServerConfig> serverConfigResolver, ILogFactory logFactory)
{
if (m_Initialized)
throw new Exception("The server had been initialized already, you cannot initialize it again!"); if (logFactory != null && !string.IsNullOrEmpty(m_Config.LogFactory))
{
throw new ArgumentException("You cannot pass in a logFactory parameter, if you have configured a root log factory.", "logFactory");
} IEnumerable<WorkItemFactoryInfo> workItemFactories; using (var factoryInfoLoader = GetWorkItemFactoryInfoLoader(m_Config, logFactory))
{
var bootstrapLogFactory = factoryInfoLoader.GetBootstrapLogFactory(); logFactory = bootstrapLogFactory.ExportFactory.CreateExport<ILogFactory>(); LogFactory = logFactory;
m_GlobalLog = logFactory.GetLog(this.GetType().Name); AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); try
{
workItemFactories = factoryInfoLoader.LoadResult(serverConfigResolver);
}
catch (Exception e)
{
if (m_GlobalLog.IsErrorEnabled)
m_GlobalLog.Error(e); return false;
}
} m_AppServers = new List<IWorkItem>(m_Config.Servers.Count()); IWorkItem serverManager = null; //Initialize servers
foreach (var factoryInfo in workItemFactories)
{
IWorkItem appServer = InitializeAndSetupWorkItem(factoryInfo); if (appServer == null)
return false; if (factoryInfo.IsServerManager)
serverManager = appServer;
else if (!(appServer is IsolationAppServer))//No isolation
{
//In isolation mode, cannot check whether is server manager in the factory info loader
if (TypeValidator.IsServerManagerType(appServer.GetType()))
serverManager = appServer;
} m_AppServers.Add(appServer);
} if (serverManager != null)
m_ServerManager = serverManager; if (!m_Config.DisablePerformanceDataCollector)
{
m_PerfMonitor = new PerformanceMonitor(m_Config, m_AppServers, serverManager, logFactory); if (m_GlobalLog.IsDebugEnabled)
m_GlobalLog.Debug("The PerformanceMonitor has been initialized!");
} if (m_GlobalLog.IsDebugEnabled)
m_GlobalLog.Debug("The Bootstrap has been initialized!"); try
{
RegisterRemotingService();
}
catch (Exception e)
{
if (m_GlobalLog.IsErrorEnabled)
m_GlobalLog.Error("Failed to register remoting access service!", e); return false;
} m_Initialized = true; return true;
}
第五个函数
d:\sourcecode\github\supersocket\socketengine\defaultbootstrap.cs
private IWorkItem InitializeAndSetupWorkItem(WorkItemFactoryInfo factoryInfo)
{
IWorkItem appServer; try
{
appServer = CreateWorkItemInstance(factoryInfo.ServerType, factoryInfo.StatusInfoMetadata); if (m_GlobalLog.IsDebugEnabled)
m_GlobalLog.DebugFormat("The server instance {0} has been created!", factoryInfo.Config.Name);
}
catch (Exception e)
{
if (m_GlobalLog.IsErrorEnabled)
m_GlobalLog.Error(string.Format("Failed to create server instance {0}!", factoryInfo.Config.Name), e);
return null;
} var exceptionSource = appServer as IExceptionSource; if (exceptionSource != null)
exceptionSource.ExceptionThrown += new EventHandler<ErrorEventArgs>(exceptionSource_ExceptionThrown); var setupResult = false; try
{
setupResult = SetupWorkItemInstance(appServer, factoryInfo); if (m_GlobalLog.IsDebugEnabled)
m_GlobalLog.DebugFormat("The server instance {0} has been initialized!", appServer.Name);
}
catch (Exception e)
{
m_GlobalLog.Error(e);
setupResult = false;
} if (!setupResult)
{
if (m_GlobalLog.IsErrorEnabled)
m_GlobalLog.Error("Failed to setup server instance!"); return null;
} return appServer;
}
第六个函数
d:\sourcecode\github\supersocket\socketengine\defaultbootstrap.cs
internal virtual bool SetupWorkItemInstance(IWorkItem workItem, WorkItemFactoryInfo factoryInfo)
{
try
{
//Share AppDomain AppServers also share same socket server factory and log factory instances
factoryInfo.SocketServerFactory.ExportFactory.EnsureInstance();
factoryInfo.LogFactory.ExportFactory.EnsureInstance();
}
catch (Exception e)
{
if (m_GlobalLog.IsErrorEnabled)
m_GlobalLog.Error(e); return false;
} return workItem.Setup(this, factoryInfo.Config, factoryInfo.ProviderFactories.ToArray());
}
第七个函数
d:\sourcecode\github\supersocket\socketbase\appserverbase.cs
/// <summary>
/// Setups the specified root config.
/// </summary>
/// <param name="bootstrap">The bootstrap.</param>
/// <param name="config">The socket server instance config.</param>
/// <param name="factories">The factories.</param>
/// <returns></returns>
bool IWorkItem.Setup(IBootstrap bootstrap, IServerConfig config, ProviderFactoryInfo[] factories)
{
if (bootstrap == null)
throw new ArgumentNullException("bootstrap"); Bootstrap = bootstrap; if (factories == null)
throw new ArgumentNullException("factories"); TrySetInitializedState(); var rootConfig = bootstrap.Config; SetupBasic(rootConfig, config, GetSingleProviderInstance<ISocketServerFactory>(factories, ProviderKey.SocketServerFactory)); if (!SetupLogFactory(GetSingleProviderInstance<ILogFactory>(factories, ProviderKey.LogFactory)))
return false; Logger = CreateLogger(this.Name); IEnumerable<IConnectionFilter> connectionFilters = null; if (!TryGetProviderInstances(factories, ProviderKey.ConnectionFilter, null,
(p, f) =>
{
var ret = p.Initialize(f.Name, this); if(!ret)
{
Logger.ErrorFormat("Failed to initialize the connection filter: {0}.", f.Name);
} return ret;
}, out connectionFilters))
{
return false;
} if (!SetupMedium(
GetSingleProviderInstance<IReceiveFilterFactory<TRequestInfo>>(factories, ProviderKey.ReceiveFilterFactory),
connectionFilters,
GetProviderInstances<ICommandLoader<ICommand<TAppSession, TRequestInfo>>>(
factories,
ProviderKey.CommandLoader,
(t) => Activator.CreateInstance(t.MakeGenericType(typeof(ICommand<TAppSession, TRequestInfo>))))))
{
return false;
} if (!SetupAdvanced(config))
return false; if (!Setup(rootConfig, config))
return false; if (!SetupFinal())
return false; m_StateCode = ServerStateConst.NotStarted;
return true;
}
第八个函数
d:\sourcecode\github\supersocket\socketbase\appserverbase.cs
private bool SetupFinal()
{
//Check receiveFilterFactory
if (ReceiveFilterFactory == null)
{
ReceiveFilterFactory = CreateDefaultReceiveFilterFactory(); if (ReceiveFilterFactory == null)
{
if (Logger.IsErrorEnabled)
Logger.Error("receiveFilterFactory is required!"); return false;
}
} var plainConfig = Config as ServerConfig; if (plainConfig == null)
{
//Using plain config model instead of .NET configuration element to improve performance
plainConfig = new ServerConfig(Config); if (string.IsNullOrEmpty(plainConfig.Name))
plainConfig.Name = Name; Config = plainConfig;
} try
{
m_ServerStatus = new StatusInfoCollection();
m_ServerStatus.Name = Name;
m_ServerStatus.Tag = Name;
m_ServerStatus[StatusInfoKeys.MaxConnectionNumber] = Config.MaxConnectionNumber;
m_ServerStatus[StatusInfoKeys.Listeners] = m_Listeners;
}
catch (Exception e)
{
if (Logger.IsErrorEnabled)
Logger.Error("Failed to create ServerSummary instance!", e); return false;
} return SetupSocketServer();
}
第九个函数
d:\sourcecode\github\supersocket\socketbase\appserverbase.cs
/// <summary>
/// Setups the socket server.instance
/// </summary>
/// <returns></returns>
private bool SetupSocketServer()
{
try
{
m_SocketServer = m_SocketServerFactory.CreateSocketServer<TRequestInfo>(this, m_Listeners, Config);
return m_SocketServer != null;
}
catch (Exception e)
{
if (Logger.IsErrorEnabled)
Logger.Error(e); return false;
}
}
第十个函数
d:\sourcecode\github\supersocket\socketengine\socketserverfactory.cs
/// <summary>
/// Default socket server factory
/// </summary>
public class SocketServerFactory : ISocketServerFactory
{
#region ISocketServerFactory Members /// <summary>
/// Creates the socket server.
/// </summary>
/// <typeparam name="TRequestInfo">The type of the request info.</typeparam>
/// <param name="appServer">The app server.</param>
/// <param name="listeners">The listeners.</param>
/// <param name="config">The config.</param>
/// <returns></returns>
public ISocketServer CreateSocketServer<TRequestInfo>(IAppServer appServer, ListenerInfo[] listeners, IServerConfig config)
where TRequestInfo : IRequestInfo
{
if (appServer == null)
throw new ArgumentNullException("appServer"); if (listeners == null)
throw new ArgumentNullException("listeners"); if (config == null)
throw new ArgumentNullException("config"); switch(config.Mode)
{
case(SocketMode.Tcp):
return new AsyncSocketServer(appServer, listeners);
case(SocketMode.Udp):
return new UdpSocketServer<TRequestInfo>(appServer, listeners);
default:
throw new NotSupportedException("Unsupported SocketMode:" + config.Mode);
}
} #endregion
}
SuperSocket中的Server是如何初Initialize的的更多相关文章
- SuperSocket中的Server是如何初Start的
第一个函数 d:\sourcecode\github\supersocket\quickstart\basic\telnetserver_startbyconfig\program.cs static ...
- SuperSocket中的Server的初始化和启动
一.初始化的过程 static void Main(string[] args) { var bootstrap = BootstrapFactory.CreateBootstrap(); if (! ...
- win7中 SQL server 2005无法连接到服务器,错误码:18456
win7中 SQL server 2005无法连接到服务器,错误码:18456.. 数据库刚装完.我用Windows登陆 结果登陆不上去.. 选中SQL Server Management Stud ...
- Asp.net中使用Server.HtmlDecode(string str)的使用
前言: 在使用Visual Studio开发web页面时,需要在GridView中绑定Table数据,并加入了CommandField, 试图,点击详情按钮是,获取GridView中Rows中Cell ...
- servers中添加server时,看不到运行环境的选择。
servers中添加server时,看不到运行环境的选择. 主要原因是tomcat目录中的配置文件格式不对.
- paip.java 开发中web server的选择jboss resin tomcat比较..
paip.java 开发中web server的选择jboss resin tomcat比较.. 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专 ...
- Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6629298 在前面一篇文章浅谈Android系 ...
- Windows10中“SQL Server 配置管理器”哪去了?
SQL Server 配置管理器是一种工具,用于管理与 SQL Server 相关联的服务.配置 SQL Server 使用的网络协议以及从 SQL Server 客户端计算机管理网络连接配置.SQL ...
- tomcat配置好后,启动eclipse中的server,不能出现有猫的页面,提示404
原因:tomcat与eclipse中的server未关联起来 解决办法:双击servers中的server,在Server Locations中选中第二项,保存之后再进行刚才的操作就好了.
随机推荐
- Python飞机大战实例有感——pygame如何实现“切歌”以及多曲重奏?
目录 pygame如何实现"切歌"以及多曲重奏? 一.pygame实现切歌 初始化路径 尝试一 尝试二 尝试三 成功 总结 二.如何在python多线程顺序执行的情况下实现音乐和音 ...
- 笔试算法题(54):快速排序实现之单向扫描、双向扫描(single-direction scanning, bidirectional scanning of Quick Sort)
议题:快速排序实现之一(单向遍历) 分析: 算法原理:主要由两部分组成,一部分是递归部分QuickSort,它将调用partition进行划分,并取得划分元素P,然后分别对P之前的部分和P 之后的部分 ...
- VIM命令大全(图+文)
在命令状态下对当前行用== (连按=两次), 或对多行用n==(n是自然数)表示自动缩进从当前行起的下面n行.你可以试试把代码缩进任意打乱再用n==排版,相当于一般IDE里的code format.使 ...
- 反连接NOT EXISTS子查询中有or 谓词连接条件SQL优化一例
背景 今天在日常数据库检查中,发现一SQL运行时间特别长,于是抓取出来,进行优化. 优化前: 耗时:503s 返回:0 SQL代码 SELECT * FROM MM_PAYABLEMONEY_TD P ...
- GROUP函数
GROUP_ID 首先我们看看官方的解释: 大意是GROUP_ID用于区分相同分组标准的分组统计结果. 解释起来比较抽象,下面我们来看看具体的案例. 例1:单一分组 SQL> select gr ...
- centOS 7 换ssh端口
centos 最少安装时缺少semanage的,要这样装补上,因为默认是安装了SElinux的 [root@localhost ~]# sestatus SELinux status: enabled ...
- Uva - 11181 Probability|Given (条件概率)
设事件B为一共有r个人买了东西,设事件Ai为第i个人买了东西. 那么这个题目实际上就是求P(Ai|B),而P(Ai|B)=P(AiB)/P(B),其中P(AiB)表示事件Ai与事件B同时发生的概率,同 ...
- 深入理解hadoop(一)
hadoop 前世今生 hadoop最早起源于开源收缩引擎nutch,由dong cutting 贡献,但由于nutch最初的设计不能解决数10亿级别的文件存储和索引而遇到了严重的可扩展性问题,直到 ...
- 恢复表数据的办法(delete删除可恢复,truncate不可恢复)
select * from table_name as of timestamp to_timestamp('2018-12-20 00:00:00', 'yyyy-mm-dd hh24:mi:ss' ...
- Oracle SqlPlus导出查询结果
Oracle SqlPlus导出查询结果 在sqlplus下导出查询的结果保存到本地sql文件中,可以采用如下方式:1.连接数据库: sqlplus xmq/xmqpwd@192.168.1.57:1 ...