Fork me on GitHub

SuperSocket 1.5 Documentation译文 14 ----- 多个服务器实例

SuperSocket支持在同一个进程中运行多个服务器实例

在同一个服务器类型中可以有多个服务器实例:

<superSocket>
    <servers>
      <server name="EchoServerA" serverTypeName="EchoService">
            <listeners>
              <add ip="Any" port="80" />
            </listeners>
      </server>
      <server name="EchoServerB" serverTypeName="EchoService" security="tls">
          <certificate filePath="localhost.pfx" password="supersocket"></certificate>
          <listeners>
              <add ip="Any" port="443" />
          </listeners>
      </server>
    </servers>
    <serverTypes>
      <add name="EchoService"
           type="SuperSocket.QuickStart.EchoService.EchoServer, SuperSocket.QuickStart.EchoService" />
    </serverTypes>
</superSocket>

他们也可以在不同的服务器类型:

<superSocket>
    <servers>
        <server name="ServerA"
                serverTypeName="MyAppServerA"
                ip="Any" port="2012">
        </server>
        <server name="ServerB"
                serverTypeName="MyAppServerB"
                ip="Any" port="2013">
        </server>
    </servers>
    <serverTypes>
        <add name="MyAppServerA"
             type="SuperSocket.QuickStart.MultipleAppServer.MyAppServerA, SuperSocket.QuickStart.MultipleAppServer" />
        <add name="MyAppServerB"
             type="SuperSocket.QuickStart.MultipleAppServer.MyAppServerB, SuperSocket.QuickStart.MultipleAppServer" />
    </serverTypes>
</superSocket>

 

隔离级别的服务器实例

正如前面提到的,有一个配置属性在SuperSocket根配置:

<superSocket isolation="AppDomain">//None or AppDomain
    ....
</superSocket>

如果隔离级别为“None”(默认值), 这些应用程序服务器实例都将共享相同的进程和相同的AppDomain. 因此,他们可以互相访问,. (我们将在以后讨论)

但是,如果隔离级别为“AppDomain”, SuperSocket将创建一个AppDomain中的每个服务器实例,它们将运行在不同的应用程序域. 由于AppDomain级别的隔离, 这些服务器实例的互相干扰的机会将减少. 另一方面,这些服务器实例之间的交互能力将削弱.

多个服务器实例之间的相互作用

正如前一节中描述的, 如果隔离级别为“None”, 多个服务器实例之间的交互是很容易的.

例如,他们可以使用SuperSocket提供的Bootstrap 互相访问:

interface IDespatchServer
{
    void DispatchMessage(string sessionKey, string message);
}

public class MyAppServerB : AppServer, IDespatchServer
{
    public void DispatchMessage(string sessionKey, string message)
    {
        var session = GetAppSessionByID(sessionKey);
        if (session == null)
            return;

        session.Send(message);
    }
}

public class MyAppServerA : AppServer
{
    private IDespatchServer m_DespatchServer;

    protected override void OnStartup()
    {
        m_DespatchServer = this.Bootstrap.GetServerByName("ServerB") as IDespatchServer;
        base.OnStartup();
    }

    internal void DespatchMessage(string targetSessionKey, string message)
    {
        m_DespatchServer.DispatchMessage(targetSessionKey, message);
    }
}

上面的示例给您演示如何从一个服务器实例发送一个消息会话到另一个服务器实例.

posted @ 2013-04-02 23:17  逗豆豆  阅读(445)  评论(0编辑  收藏  举报