扩展服务器配置

关键字: 扩展配置, 自定义配置, 自定义属性, GetChildConfig, 读取配置,子节点

当你使用 SuperSocket 实现 Socket 服务器的时候,不可避免的需要在配置文件中定义一些参数。 SuperSocket 提供了非常简单的方法,让你在配置文件中定义这些参数,然后在你的代码中读取它们。

请看下面的配置代码:

  1. <server name="FlashPolicyServer"
  2. serverType="SuperSocket.Facility.PolicyServer.FlashPolicyServer, SuperSocket.Facility"
  3. ip="Any" port="843"
  4. receiveBufferSize="32"
  5. maxConnectionNumber="100"
  6. clearIdleSession="true"
  7. policyFile="Policy\flash.xml">
  8. </server>

在上面的配置中, 属性 "policyFile" 未在 SuperSocket 中定义, 不过你任然可以在你的 AppServer 类中读取它:

  1. public class YourAppServer : AppServer
  2. {
  3. private string m_PolicyFile;
  4. protected override bool Setup(IRootConfig rootConfig, IServerConfig config)
  5. {
  6. m_PolicyFile = config.Options.GetValue("policyFile");
  7. if (string.IsNullOrEmpty(m_PolicyFile))
  8. {
  9. if(Logger.IsErrorEnabled)
  10. Logger.Error("Configuration option policyFile is required!");
  11. return false;
  12. }
  13. return true;
  14. }
  15. }

你不仅可以在 server 节点定义属性, 而且你还能像下面的代码那样定义子节点:

  1. <server name="SuperWebSocket"
  2. serverTypeName="SuperWebSocket"
  3. ip="Any" port="2011" mode="Tcp">
  4. <subProtocols>
  5. <!--Your configuration-->
  6. </subProtocols>
  7. </server>

下面是所需的节点对应的配置类:

  1. /// <summary>
  2. /// SubProtocol configuration
  3. /// </summary>
  4. public class SubProtocolConfig : ConfigurationElement
  5. {
  6. //Configuration attributes
  7. }
  8. /// <summary>
  9. /// SubProtocol configuation collection
  10. /// </summary>
  11. [ConfigurationCollection(typeof(SubProtocolConfig))]
  12. public class SubProtocolConfigCollection : ConfigurationElementCollection
  13. {
  14. //Configuration attributes
  15. }

然后你就能在 AppServer 类中读取这个子节点了:

  1. public class YourAppServer : AppServer
  2. {
  3. private SubProtocolConfigCollection m_SubProtocols;
  4. protected override bool Setup(IRootConfig rootConfig, IServerConfig config)
  5. {
  6. m_SubProtocols = config.GetChildConfig<SubProtocolConfigCollection>("subProtocols");
  7. if (m_SubProtocols == null)
  8. {
  9. if(Logger.IsErrorEnabled)
  10. Logger.Error("The child configuration node 'subProtocols' is required!");
  11. return false;
  12. }
  13. return true;
  14. }
  15. }