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自帶的配置技術(shù),SuperSocket有一個專門的配置Section.使用配置啟動SuperSocket可以靈活配置選項
? ? ?配置完成后,還需要修改program類。將原有在program中定義的端口信息以及方法注釋,只保留服務(wù)啟動和停止的代碼。引入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 * 創(chuàng)建時間:2017-01-19 00:02:17 * 2017 * 描述說明:服務(wù)啟動和停止入口 * * 修改歷史: 2017 -01-19 調(diào)整自定義mysession和myserver * * *****************************************************************/ namespace SuperSocketDemo {class Program{/// <summary>/// SuperSocket服務(wù)啟動或停止/// </summary>/// <param name="args"></param>static void Main(string[] args){Console.WriteLine("請按任何鍵進(jìn)行啟動SuperSocket服務(wù)!");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);//設(shè)置端口號//int port = 2017;//啟動應(yīng)用服務(wù)端口//if (!appServer.Setup(port)) //啟動時監(jiān)聽端口2017//{// Console.WriteLine("服務(wù)端口啟動失敗!");// Console.ReadKey();// return;//}//Console.WriteLine();////嘗試啟動應(yīng)用服務(wù)//if (!appServer.Start())//{// Console.WriteLine("服務(wù)啟動失敗!");// Console.ReadKey();// return;//}var result = bootstrap.Start();Console.WriteLine("服務(wù)正在啟動: {0}!", result);if (result == StartResult.Failed){Console.WriteLine("服務(wù)啟動失敗!");Console.ReadKey();return;}Console.WriteLine("服務(wù)啟動成功,請按'E'停止服務(wù)!");while (Console.ReadKey().KeyChar != 'E'){Console.WriteLine();continue;}//停止服務(wù)// appServer.Stop(); bootstrap.Stop();Console.WriteLine("服務(wù)已停止!");Console.ReadKey();}/// <summary>/// 在事件處理代碼中發(fā)送歡迎信息給客戶端/// </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類? ? 最后我們看一下修改后程序的運行結(jié)果:
斷開調(diào)試工具看一下效果,可以看到服務(wù)端顯示客戶端斷開連接
注意事項:
a) MyServer、自定義命令和MySession的訪問權(quán)限必須設(shè)置為public b) MyServer父類為AppServer<MySession> c) MySession父類為AppSession<MySession> d) HELLO父類為CommandBase<MySession,StringRequestInfo>,ExecueteCommand方法傳入值類型分別為MySession和StringRequestInfo e) 多服務(wù)器中需注意AppSession、AppServer、自定義命令中的AppSession不要搞錯 調(diào)試常見錯誤:? ? ?總結(jié):
? ? ?通過自定義Session和Server,可以實現(xiàn)我們自己的AppSession和AppServer允許你根據(jù)你業(yè)務(wù)的需求來方便的擴展SuperSocket,你可以綁定session的連接和斷開事件,服務(wù)器實例的啟動和停止事件。你還可以在AppServer的Setup方法中讀取你的自定義配置信息??偠灾?#xff0c;這些功能讓你方便的創(chuàng)建一個你所需要的socket服務(wù)器成為可能。
轉(zhuǎn)載于:https://www.cnblogs.com/fly-bird/p/6308974.html
總結(jié)
以上是生活随笔為你收集整理的SuperSocket入门(二)- 探索AppServer、AppSession,Conmmand和App.config的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java web 初入
- 下一篇: 怎样将python的文件转化为windo