C# 使用SuperSocket


一、需求場景

  (1)使用SuperSocket進行網絡通信

二、所需軟件

  (1)SocketTool

三、實現步驟

  (1)使用Nuget管理器安裝SuperSocket.Engine

 該插件已經包含(SuperSocket插件)

注意:SuperSocket里面集成了log4net(如果你的程序中已經引入了log4net,一定要注意版本是否一致,如果不一致,會報錯)

  (2)新建一個SocketSession類,繼承自AppSession

 1 using SuperSocket.SocketBase;
 2 using System;
 3 using System.Text;
 4 using SuperSocket.SocketBase.Protocol;
 5 
 6 namespace SuperSocketBlog
 7 {
 8     public class SocketSession : AppSession<SocketSession>
 9     {
10         public override void Send(string message)
11         {
12             Console.WriteLine("發送消息:" + message);
13             base.Send(message);
14         }
15 
16         protected override void OnSessionStarted()
17         {
18             Console.WriteLine("Session已啟動");
19             base.OnSessionStarted();
20         }
21 
22         protected override void OnInit()
23         {
24             this.Charset = Encoding.GetEncoding("gb2312");
25             base.OnInit();
26         }
27 
28         protected override void HandleUnknownRequest(StringRequestInfo requestInfo)
29         {
30             Console.WriteLine("遇到未知的請求");
31             base.HandleUnknownRequest(requestInfo);
32         }
33     }
34 }

  (3)新建一個SocketServer類,繼承自AppServer

 1 using SuperSocket.SocketBase;
 2 using System;
 3 using SuperSocket.SocketBase.Config;
 4 
 5 namespace SuperSocketBlog
 6 {
 7     public class SocketServer : AppServer<SocketSession>
 8     {
 9         protected override bool Setup(IRootConfig rootConfig, IServerConfig config)
10         {
11             Console.WriteLine("正在准備配置文件");
12             return base.Setup(rootConfig, config);
13         }
14 
15         protected override void OnStarted()
16         {
17             Console.WriteLine("服務已開始");
18             base.OnStarted();
19         }
20 
21         protected override void OnStopped()
22         {
23             Console.WriteLine("服務已停止");
24             base.OnStopped();
25         }
26         protected override void OnNewSessionConnected(SocketSession session)
27         {
28             Console.WriteLine("新的連接地址為" + session.LocalEndPoint.Address.ToString() + ",時間為" + DateTime.Now);
29             base.OnNewSessionConnected(session);
30         }
31     }
32 }

  (4)在配置文件中進行配置,配置后的代碼如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="superSocket" type="SuperSocket.SocketEngine.Configuration.SocketServiceConfig, SuperSocket.SocketEngine" />
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>
  <!--配置SocketServer路徑-->
  <superSocket>
    <servers>
      <server name="MySocket" textEncoding="gb2312"
              serverType="SuperSocketBlog.SocketServer, SuperSocketBlog"
             ip="Any" port="2018" maxConnectionNumber="100">
      </server>
    </servers>
  </superSocket>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
    </startup>
</configuration>

  說明:server節點的serverType的屬性值第一個是SocketServer的位置,第二個是程序集的名稱。

  (5)添加命令類Apply,繼承自CommandBase

 1 using SuperSocket.SocketBase.Command;
 2 using SuperSocket.SocketBase.Protocol;
 3 using System;
 4 
 5 namespace SuperSocketBlog
 6 {
 7     public class Apply:CommandBase<SocketSession,StringRequestInfo>
 8     {
 9         public override void ExecuteCommand(SocketSession session, StringRequestInfo requestInfo)
10         {
11             //根據參數個數或者其他條件判斷,來進行一些自己的操作
12             if (requestInfo.Parameters.Length==2)
13             {
14                 Console.WriteLine("調用成功");
15                 session.Send("已經成功接收到你的請求\r\n");
16             }
17             else
18             {
19                 session.Send("參數不正確\r\n");
20             }
21         }
22     }
23 }

(6)在Program.cs文件中對Socket進行初始化

 1             #region 初始化Socket
 2             IBootstrap bootstrap = BootstrapFactory.CreateBootstrap();
 3             if (!bootstrap.Initialize())
 4             {
 5                 Console.WriteLine(DateTime.Now + ":Socket初始化失敗\r\n");
 6                 return;
 7             }
 8 
 9             var result = bootstrap.Start();
10             foreach (var server in bootstrap.AppServers)
11             {
12                 if (server.State == ServerState.Running)
13                 {
14                     Console.WriteLine(DateTime.Now + ":serverName為:" + server.Name + "Socket運行中\r\n");
15                     Console.Read();
16                 }
17                 else
18                 {
19                     Console.WriteLine(DateTime.Now + ":serverName為:" + server.Name + "Socket啟動失敗\r\n");
20                 }
21             }
22             #endregion

四、測試

  (1)初始化界面

  (2)打開SocketTool軟件,新建一個客戶端,連接的端口號(2018)要和上面配置文件中設置的端口號一致。

(3)點擊連接按鈕效果圖

(4)使用Apply命令效果圖

說明:(1)發送請求時中間用空格隔開,默認第一個參數為命令名稱(和剛才建立的命令類Apply要一致),后面的是需要傳遞的參數。

  (2)使用SocketTool軟件發送請求的時候,要按回車,再點擊發送,服務器端才可以接收到。

問題:(1)如果需求場景變為:可以接收json字符串或者命令(不限制命令名稱)格式。則該程序如果接收到Json字符串或者除Apply之外的命令,就需要在SocketSession類里面的

HandleUnknownRequest方法里進行處理。
(2)如果不限定命令名稱,統一對發送的信息進行處理該怎么寫呢?

 

寫在后面的話:SuperSocket只是會簡單的連接,發信息,其實對原理還有更深層的編程不熟悉,還需要再進行深層次的探索。忽然發現好像每一篇文章的最后都有類似的話語,每一個都研究的不深入,只是皮毛而已呢(捂臉)。

 


免責聲明!

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



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