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
}
}