在SuperSocket入门(二)中我们已经简单了解了通过配置App.config文件使用BootStrap启动SuperSocket服务。我们先来看一下上个案例中的基本配置文件示例:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<!--log 日志记录-->
<section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
<!--SocketEngine-->
<section name="superSocket" type="SuperSocket.SocketEngine.Configuration.SocketServiceConfig, SuperSocket.SocketEngine"/>
</configSections>
<!--服务信息描述,在window服务模式下的名称标识-->
<appSettings>
<add key="ServiceName" value="SupperSocketService"/>
<add key="ServiceDescription" value="黄昏前黎明后的Socket程序"/>
</appSettings>
<!--SuperSocket服务配置信息 serverType是项目的服务如我自定义的myserver-->
<!--name: 实例名称
serverType: 实例运行的AppServer类型
ip: 侦听ip
port: 侦听端口-->
<superSocket>
<servers>
<!--textEncoding 编码方式"gb2312","utf-8" 默认是acii-->
<server name="SuperSocketDemo" textEncoding="gb2312" serverType="SuperSocketDemo.Server.MyServer,SuperSocketDemo" ip="Any" port="2020" maxConnectionNumber="100">
</server>
</servers>
</superSocket>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2"/>
</startup>
</configuration>
1、服务名称:
<appSettings>
<add key="ServiceName" value="SupperSocketService"/>
<add key="ServiceDescription" value="黄昏前黎明后的Socket程序"/>
</appSettings>
这个配置项将被用作SuperSocket系统服务的名称。如果ServiceName设置成SupperSocketService, 则运行InstallService.bat这个批处理文件之后(注意:该处理文件使用的是SuperSocket.SocketService.exe -i命令,使用supersocket.socketservice.exe务必使server所需要的所有程序集都和SuperSocket.SocketService.exe在同一目录), SuperSocket系统服务将以"SupperSocketService"这个名字安装到系统之中。
2、 SuperSocket的根配置
<socketServer loggingMode="IndependantFile">
....
</socketServer>
根配置中的参数详情:
loggingMode 值: ShareFile: 多个服务器实例共享同日志文件,默认选项;
IndependantFile:多个服务器实例拥有独立的日志文件;
Console: 控制台日志输出,只在控制台应用程序中有效。
maxWorkingThreads:线程池最大工作线程数量
minWorkingThreads:线程池最小工作线程数量
maxCompletionPortThreads:线程池最大完成端口线程数量
minCompletionPortThreads:线程池最小完成端口线程数量
3、服务器实例配置
<servers>
<server name="SuperSocketDemo" textEncoding="gb2312" serverType="SuperSocketDemo.Server.MyServer,SuperSocketDemo" ip="Any" port="2020" maxConnectionNumber="100">
</server>
</servers>
服务器实例配置详情:
4、多服务器实例的配置
SuperSocket支持在同一程序中运行多个服务器实例监听在不同的IP或端口,只需在配置文件中添加两个server节点,设置不同的实例名称和IP端口组合即可。
<servers>
<server name="MyServerA"
serviceName="SupperSocketServiceA"
ip="Any"
port="2016">
</server>
<server name="MyServerB"
serviceName="SupperSocketServiceB"
ip="Any"
port="2017">
</server>
<services>
<service name="SupperSocketServiceA" type="SuperSocketDemo.Server.MyServerA,SuperSocketDemo.SupperSocketServiceA" />
<service name="SupperSocketServiceB" type="SuperSocketDemo.Server.MyServerB,SuperSocketDemo.SupperSocketServiceB" />
</services>
服务配置
name: 服务定义的名称,即服务器实例节点serviceName所对应的名称。
type: 该服务所对应MyServer类型的完整名称。
在某些情况下,需要两个服务器实例之间进行交互。例如MyServerA上的客户端C1向MyServerB上的客户端C2转发消息,这样就需要MyServerA接收到C1的命令之后通过MyServerB将消息转发给客户端C2。在MyServerA的OnStartup方法里面可利用SocketServerManager的GetServerByName(string name)方法通过服务器实例的名称来获取服务器实例:
public class MyServerA : AppServer
{
private IDespatchServer m_DespatchServer;
protected override void OnStartup()
{
m_DespatchServer = SocketServerManager.GetServerByName("ServerB") as IDespatchServer;
base.OnStartup();
}
internal void DespatchMessage(string targetSessionKey, string message)
{
m_DespatchServer.DispatchMessage(targetSessionKey, message);
}
}
public class MyServerB : AppServer, IDespatchServer
{
public void DispatchMessage(string sessionKey, string message)
{
var session = GetAppSessionByIndentityKey(sessionKey);
if (session == null)
return;
session.SendResponse(message);
}
}
}
interface IDespatchServer
{
void DispatchMessage(string sessionKey, string message);
}
这样就可以在MyServerA中通过调用MyServerB实例的方法来向MyServerB的客户端发送消息了。使用 SuperSocket 实现 Socket 服务器的时候,不可避免的需要在配置文件中定义一些参数。 SuperSocket 提供了非常简单的方法,让我们在配置文件中定义这些参数,然后在代码中读取它们。服务端扩展配置,自定义属性字段我们后面再来学习。