using System; using System.Collections.Generic; using System.Configuration; using System.Linq; namespace Sodao.FastSocket.Server { /// /// Socket server manager. /// public class SocketServerManager { #region Private Members /// /// key:server name. /// static private readonly Dictionary _dicHosts = new Dictionary(); #endregion #region Static Methods /// /// 初始化Socket Server /// static public void Init() { Init("socketServer"); } /// /// 初始化Socket Server /// /// static public void Init(string sectionName) { if (string.IsNullOrEmpty(sectionName)) throw new ArgumentNullException("sectionName"); Init(ConfigurationManager.GetSection(sectionName) as Config.SocketServerConfig); } /// /// 初始化Socket Server /// /// static public void Init(Config.SocketServerConfig config) { if (config == null) throw new ArgumentNullException("config"); if (config.Servers == null) return; foreach (Config.Server serverConfig in config.Servers) { //init protocol var objProtocol = GetProtocol(serverConfig.Protocol); if (objProtocol == null) throw new InvalidOperationException("protocol"); //init custom service var tService = Type.GetType(serverConfig.ServiceType, false); if (tService == null) throw new InvalidOperationException("serviceType"); var objService = Activator.CreateInstance(tService); if (objService == null) throw new InvalidOperationException("serviceType"); //init host. _dicHosts.Add(serverConfig.Name, Activator.CreateInstance( typeof(SocketServer<>).MakeGenericType( objProtocol.GetType().GetInterface(typeof(Protocol.IProtocol<>).Name).GetGenericArguments()), serverConfig.Port, objService, objProtocol, serverConfig.SocketBufferSize, serverConfig.MessageBufferSize, serverConfig.MaxMessageSize, serverConfig.MaxConnections) as SocketBase.IHost); } } /// /// 初始化Socket Server /// /// 端口号 static public void Init(int nSocketPort) { Init("socketServer", nSocketPort); } /// /// 初始化Socket Server /// /// static public void Init(string sectionName, int nSocketPort) { if (string.IsNullOrEmpty(sectionName)) throw new ArgumentNullException("sectionName"); Init(ConfigurationManager.GetSection(sectionName) as Config.SocketServerConfig, nSocketPort); } #region 定制方便修改端口号 /// /// 初始化Socket Server /// /// static public void Init(Config.SocketServerConfig config, int nSocketPort) { if (config == null) throw new ArgumentNullException("config"); if (config.Servers == null) return; foreach (Config.Server serverConfig in config.Servers) { //init protocol var objProtocol = GetProtocol(serverConfig.Protocol); if (objProtocol == null) throw new InvalidOperationException("protocol"); //init custom service var tService = Type.GetType(serverConfig.ServiceType, false); if (tService == null) throw new InvalidOperationException("serviceType"); var objService = Activator.CreateInstance(tService); if (objService == null) throw new InvalidOperationException("serviceType"); if (nSocketPort == 0) nSocketPort = serverConfig.Port; //init host. _dicHosts.Add(serverConfig.Name, Activator.CreateInstance( typeof(SocketServer<>).MakeGenericType( objProtocol.GetType().GetInterface(typeof(Protocol.IProtocol<>).Name).GetGenericArguments()), nSocketPort, objService, objProtocol, serverConfig.SocketBufferSize, serverConfig.MessageBufferSize, serverConfig.MaxMessageSize, serverConfig.MaxConnections) as SocketBase.IHost); } } #endregion /// /// get protocol. /// /// /// static public object GetProtocol(string protocol) { switch (protocol) { case Protocol.ProtocolNames.Thrift: return new Protocol.ThriftProtocol(); case Protocol.ProtocolNames.CommandLine: return new Protocol.CommandLineProtocol(); case Protocol.ProtocolNames.HxProtocol: return new Protocol.HxProtocol(); } return Activator.CreateInstance(Type.GetType(protocol, false)); } /// /// 启动服务 /// static public void Start() { _dicHosts.ToList().ForEach(c => c.Value.Start()); } /// /// 停止服务 /// static public void Stop() { _dicHosts.ToList().ForEach(c => c.Value.Stop()); } /// /// try get host by name. /// /// /// /// static public bool TryGetHost(string name, out SocketBase.IHost host) { return _dicHosts.TryGetValue(name, out host); } #endregion } }