SuperSocket中的Server的初始化和启动
一、初始化的过程
static void Main(string[] args) { var bootstrap = BootstrapFactory.CreateBootstrap(); if (!bootstrap.Initialize()) { Console.WriteLine("Failed to initialize!"); Console.ReadKey(); return; } }
supersocket\socketengine\defaultbootstrap.cs
DefaultBootStrap.cs public virtual bool Initialize() { return Initialize(c => c); } public virtual bool Initialize(Func<IServerConfig, IServerConfig> serverConfigResolver) { return Initialize(serverConfigResolver, null); } public virtual bool Initialize(Func<IServerConfig, IServerConfig> serverConfigResolver, ILogFactory logFactory) { foreach (var factoryInfo in workItemFactories) { IWorkItem appServer = InitializeAndSetupWorkItem(factoryInfo); } } private IWorkItem InitializeAndSetupWorkItem(WorkItemFactoryInfo factoryInfo) { setupResult = SetupWorkItemInstance(appServer, factoryInfo); } internal virtual bool SetupWorkItemInstance(IWorkItem workItem, WorkItemFactoryInfo factoryInfo) { return workItem.Setup(this, factoryInfo.Config, factoryInfo.ProviderFactories.ToArray()); }
supersocket\socketbase\appserverbase.cs
bool IWorkItem.Setup(IBootstrap bootstrap, IServerConfig config, ProviderFactoryInfo[] factories) { Bootstrap = bootstrap; if (!SetupFinal()) return false; } private bool SetupFinal() { return SetupSocketServer(); } private bool SetupSocketServer() { m_SocketServer = m_SocketServerFactory.CreateSocketServer<TRequestInfo>(this, m_Listeners, Config); }
supersocket\socketengine\socketserverfactory.cs
public ISocketServer CreateSocketServer<TRequestInfo>(IAppServer appServer, ListenerInfo[] listeners, IServerConfig config) where TRequestInfo : IRequestInfo { case(SocketMode.Tcp): return new AsyncSocketServer(appServer, listeners); }
二、启动的过程
var bootstrap = BootstrapFactory.CreateBootstrap(); var result = bootstrap.Start();
supersocket\socketengine\defaultbootstrap.cs
//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);
}
public StartResult Start() { foreach (var server in m_AppServers) { if (!server.Start()) {} } }
supersocket\socketbase\appserver.cs
public override bool Start() { if (!base.Start()) return false; }
supersocket\socketbase\appserverbase.cs
m_SocketServer = m_SocketServerFactory.CreateSocketServer<TRequestInfo>(this, m_Listeners, Config);
public virtual bool Start() { if (!m_SocketServer.Start()) { m_StateCode = ServerStateConst.NotStarted; return false; } }
SuperSocket\SocketEngine\AsyncSocketServer.cs
public override bool Start() { if (!base.Start()) return false; }
supersocket\socketengine\socketserverbase.cs
var listener = CreateListener(ListenerInfos[i]);
d:\sourcecode\github\supersocket\socketengine\tcpsocketserverbase.cs
protected override ISocketListener CreateListener(ListenerInfo listenerInfo)
{
return new TcpAsyncSocketListener(listenerInfo);
}
d:\sourcecode\github\supersocket\socketengine\tcpasyncsocketlistener.cs
public TcpAsyncSocketListener(ListenerInfo info)
: base(info)
{
m_ListenBackLog = info.BackLog;
}
d:\sourcecode\github\supersocket\socketengine\socketlistenerbase.cs
protected SocketListenerBase(ListenerInfo info)
{
Info = info;
}
public SocketServerBase(IAppServer appServer, ListenerInfo[] listeners)
{
AppServer = appServer;
IsRunning = false;
ListenerInfos = listeners;
Listeners = new List<ISocketListener>(listeners.Length);
}
public TcpSocketServerBase(IAppServer appServer, ListenerInfo[] listeners)
: base(appServer, listeners)
public virtual bool Start() { if (listener.Start(AppServer.Config)) { } }
SuperSocket\SocketEngine\TcpAsyncSocketListener.cs
d:\sourcecode\github\supersocket\socketengine\socketlistenerbase.cs
public ListenerInfo Info { get; private set; }
protected SocketListenerBase(ListenerInfo info)
{
Info = info;
}
public override bool Start(IServerConfig config) { m_ListenSocket = new Socket(this.Info.EndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); if (!m_ListenSocket.AcceptAsync(acceptEventArg)) ProcessAccept(acceptEventArg); }
作者:Chuck Lu GitHub |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了