SuperSocket入門(三)-Telnet多服務實例和服務實例交互配置詳解


    在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>
App.config

       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>
         服務器實例配置詳情:
  • name: 服務器實例名稱
  • serviceName: 指定服務器實例運行的服務的名稱。此名稱為定義此服務器實例運行的服務的節點的名稱。
  • ip: 指定socket服務器監聽的服務器IP地址。Any: 監聽本機所有的IPv4地址;IPv6Any, 監聽本機所有IPv6的地址。
  • port: 指定socket服務器監聽的端口。
  • mode: Sync:同步模式;Async: 異步模式;Udp: Udp協議
  • disabled: true或者false。是否禁用該服務器實例,默認為否。
  • readTimeOut: 從socket讀取數據超時時間,默認為0。
  • sendTimeOut: 從socket發送數據超時時間,默認為0。
  • maxConnectionNumber: 最大允許的客戶端連接數目,默認為100。
  • receiveBufferSize: 用於接收數據的緩沖區大小,默認為2048。
  • sendBufferSize: 用戶發送數據的緩沖區大小,默認為2048。
  • logCommand: true或者false,是否記錄命令。
  • clearIdleSession: true或者false, 是否清除空閑會話,默認為false。
  • clearIdleSessionInterval: 清除空閑會話的時間間隔,默認為120,單位為秒。
  • idleSessionTimeOut: 會話超時時間,默認值為300,單位為秒。
  • security: Empty, Tls或者Ssl3。 Socket服務器所采用的傳輸層加密協議,默認值為空。
  • maxCommandLength: 最大允許的命令長度,默認值為1024。
  • disableSessionSnapshot: 是否禁用會話快照,默認值為false。(1.4 SP1)
  • sessionSnapshotInterval: 生成會話快照的時間間隔。默認值為5,單位為秒。
  • keepAliveTime: keep alive消息發送時間間隔。默認值為600, 單位為秒。
  • keepAliveInterval:keep alive失敗重試的時間間隔。默認值為60, 單位為秒。
       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);
}
}
MyServerA 類
public class MyServerB : AppServer, IDespatchServer
{
public void DispatchMessage(string sessionKey, string message)
{
var session = GetAppSessionByIndentityKey(sessionKey);
if (session == null)
return;
 
session.SendResponse(message);
}
}
}
MyServerB 類
interface IDespatchServer
{
void DispatchMessage(string sessionKey, string message);
}
 
IDespatchServer類 
      這樣就可以在MyServerA中通過調用MyServerB實例的方法來向MyServerB的客戶端發送消息了。使用 SuperSocket 實現 Socket 服務器的時候,不可避免的需要在配置文件中定義一些參數。 SuperSocket 提供了非常簡單的方法,讓我們在配置文件中定義這些參數,然后在代碼中讀取它們。服務端擴展配置,自定義屬性字段我們后面再來學習。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM