SuperSocket入门(二)- 探索AppServer、AppSession,Conmmand和App.config
? ? ?定義一個名為"ADD"的類去處理Key為"ADD"的請求:
public class ADD : CommandBase<MySession, StringRequestInfo> {public override void ExecuteCommand(MySession session, StringRequestInfo requestInfo){session.Send(requestInfo.Parameters.Select(p => Convert.ToInt32(p)).Sum().ToString());} } Add類? ? ?定義一個名為"MULT"的類去處理Key為"MULT"的請求:
public class MULT : CommandBase<MySession, StringRequestInfo> {public override void ExecuteCommand(MySession session, StringRequestInfo requestInfo){var result = 1;foreach (var factor in requestInfo.Parameters.Select(p => Convert.ToInt32(p))){result *= factor;}session.Send(result.ToString());} } Mult類 ? ? 定義一個名為"Echo"的類去處理Key為"Echo"的請求:public class Echo: CommandBase<MySession, StringRequestInfo>{public override void ExecuteCommand(MySession session, StringRequestInfo requestInfo){session.Send(requestInfo.Body);}} Echo類
? ??同時我們要移除請求處理方法的注冊,因為它和命令不能同時被支持,注釋下面代碼即可
? ? //appServer.NewRequestReceived += new RequestHandler<MySession, StringRequestInfo>(appServer_NewRequestReceived);
? ?4、配置App.config使用BootStrap啟動SuperSocket
? ?SuperSocket配置section SuperSocket使用.NET自帶的配置技術,SuperSocket有一個專門的配置Section.使用配置啟動SuperSocket可以靈活配置選項
? ? ?配置完成后,還需要修改program類。將原有在program中定義的端口信息以及方法注釋,只保留服務啟動和停止的代碼。引入using?SuperSocket.SocketEngine;使用BootStrap啟動
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using SuperSocket.SocketBase; using SuperSocket.SocketBase.Protocol; using SuperSocket.SocketEngine; using SuperSocketDemo.Server;/**************************************************************** * 作者:黃昏前黎明后 * CLR版本:4.0.30319.42000 * 創建時間:2017-01-19 00:02:17 * 2017 * 描述說明:服務啟動和停止入口 * * 修改歷史: 2017 -01-19 調整自定義mysession和myserver * * *****************************************************************/ namespace SuperSocketDemo {class Program{/// <summary>/// SuperSocket服務啟動或停止/// </summary>/// <param name="args"></param>static void Main(string[] args){Console.WriteLine("請按任何鍵進行啟動SuperSocket服務!");Console.ReadKey();Console.WriteLine();var bootstrap = BootstrapFactory.CreateBootstrap();if (!bootstrap.Initialize()){Console.WriteLine("初始化失敗!");Console.ReadKey();return;}//修改appserver為myserver//var appServer = new AppServer();// var appServer = new MyServer();//注冊事件// appServer.NewSessionConnected += new SessionHandler<AppSession>(appServer_NewSessionConnected);//appServer.NewRequestReceived += new RequestHandler<AppSession, StringRequestInfo>(appServer_NewRequestReceived);//設置端口號//int port = 2017;//啟動應用服務端口//if (!appServer.Setup(port)) //啟動時監聽端口2017//{// Console.WriteLine("服務端口啟動失敗!");// Console.ReadKey();// return;//}//Console.WriteLine();////嘗試啟動應用服務//if (!appServer.Start())//{// Console.WriteLine("服務啟動失敗!");// Console.ReadKey();// return;//}var result = bootstrap.Start();Console.WriteLine("服務正在啟動: {0}!", result);if (result == StartResult.Failed){Console.WriteLine("服務啟動失敗!");Console.ReadKey();return;}Console.WriteLine("服務啟動成功,請按'E'停止服務!");while (Console.ReadKey().KeyChar != 'E'){Console.WriteLine();continue;}//停止服務// appServer.Stop(); bootstrap.Stop();Console.WriteLine("服務已停止!");Console.ReadKey();}/// <summary>/// 在事件處理代碼中發送歡迎信息給客戶端/// </summary>/// <param name="session"></param>//static void appServer_NewSessionConnected(AppSession session)//{// session.Send("Welcome to SuperSocket Telnet Server!");//}/// <summary>///客戶端請求處理/// </summary>/// <param name="session">會話</param>/// <param name="requestInfo">請求信息</param>//static void appServer_NewRequestReceived(AppSession session, StringRequestInfo requestInfo)//{// switch (requestInfo.Key.ToUpper())// {// case ("ECHO"):// session.Send(requestInfo.Body);// break;// case ("ADD"):// session.Send(requestInfo.Parameters.Select(p => Convert.ToInt32(p)).Sum().ToString());// break;// case ("MULT"):// var result = 1;// foreach (var factor in requestInfo.Parameters.Select(p => Convert.ToInt32(p)))// {// result *= factor;// }// session.Send(result.ToString());// break;// }//} } } program類? ? 最后我們看一下修改后程序的運行結果:
斷開調試工具看一下效果,可以看到服務端顯示客戶端斷開連接
注意事項:
a) MyServer、自定義命令和MySession的訪問權限必須設置為public b) MyServer父類為AppServer<MySession> c) MySession父類為AppSession<MySession> d) HELLO父類為CommandBase<MySession,StringRequestInfo>,ExecueteCommand方法傳入值類型分別為MySession和StringRequestInfo e) 多服務器中需注意AppSession、AppServer、自定義命令中的AppSession不要搞錯 調試常見錯誤:? ? ?總結:
? ? ?通過自定義Session和Server,可以實現我們自己的AppSession和AppServer允許你根據你業務的需求來方便的擴展SuperSocket,你可以綁定session的連接和斷開事件,服務器實例的啟動和停止事件。你還可以在AppServer的Setup方法中讀取你的自定義配置信息。總而言之,這些功能讓你方便的創建一個你所需要的socket服務器成為可能。
轉載于:https://www.cnblogs.com/fly-bird/p/6308974.html
總結
以上是生活随笔為你收集整理的SuperSocket入门(二)- 探索AppServer、AppSession,Conmmand和App.config的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java web 初入
- 下一篇: 怎样将python的文件转化为windo