一、需求場景
(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只是會簡單的連接,發信息,其實對原理還有更深層的編程不熟悉,還需要再進行深層次的探索。忽然發現好像每一篇文章的最后都有類似的話語,每一個都研究的不深入,只是皮毛而已呢(捂臉)。