首页 > 代码库 > SuperSocket服务器架设(三):在SuperSocket中自定义Command、AppServer和AppSession

SuperSocket服务器架设(三):在SuperSocket中自定义Command、AppServer和AppSession

1.      创建自定义类MySession,继承AppSession类并重写AppSession类的方法

  注:一个AppSession对象对应一个连接

[csharp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using SuperSocket;  
  6. using SuperSocket.Common;  
  7. using SuperSocket.SocketBase;  
  8. using SuperSocket.SocketBase.Protocol;  
  9.   
  10. namespace SuperSocketApp1  
  11. {  
  12.     /// <summary>  
  13.     /// 自定义连接类MySession,继承AppSession,并传入到AppSession  
  14.     /// </summary>  
  15.     public class MySession : AppSession<MySession>  
  16.     {  
  17.         /// <summary>  
  18.         /// 新连接  
  19.         /// </summary>  
  20.         protected override void OnSessionStarted()  
  21.         {  
[csharp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. <span style="white-space:pre">  </span>    //输出客户端IP地址  
  2.             Console.WriteLine(this.LocalEndPoint.Address.ToString());  
  3.             this.Send("\n\rHello User");  
  4.         }  
  5.   
  6.         /// <summary>  
  7.         /// 未知的Command  
  8.         /// </summary>  
  9.         /// <param name="requestInfo"></param>  
  10.         protected override void HandleUnknownRequest(StringRequestInfo requestInfo)  
  11.         {  
  12.             this.Send("\n\r未知的命令");  
  13.         }  
  14.   
  15.         /// <summary>  
  16.         /// 捕捉异常并输出  
  17.         /// </summary>  
  18.         /// <param name="e"></param>  
  19.         protected override void HandleException(Exception e)  
  20.         {  
  21.             this.Send("\n\r异常: {0}", e.Message);  
  22.         }  
  23.   
  24.         /// <summary>  
  25.         /// 连接关闭  
  26.         /// </summary>  
  27.         /// <param name="reason"></param>  
  28.         protected override void OnSessionClosed(CloseReason reason)  
  29.         {  
  30.             base.OnSessionClosed(reason);  
  31.         }  
  32.     }  
  33. }  

 

2.      创建自定义类MyServer,继承AppServer类并重写AppServer类的方法

[csharp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using SuperSocket.SocketBase;  
  6. using SuperSocket.SocketBase.Config;  
  7.   
  8. namespace SuperSocketApp1  
  9. {  
  10.     /// <summary>  
  11.     /// 自定义服务器类MyServer,继承AppServer,并传入自定义连接类MySession  
  12.     /// </summary>  
  13.     public class MyServer : AppServer<MySession>  
  14.     {  
  15.         protected override void OnStartup()  
  16.         {  
  17.             base.OnStartup();  
  18.             Console.WriteLine("服务器已启动");  
  19.         }  
  20.   
  21.         /// <summary>  
  22.         /// 输出新连接信息  
  23.         /// </summary>  
  24.         /// <param name="session"></param>  
  25.         protected override void OnNewSessionConnected(MySession session)  
  26.         {  
  27.             base.OnNewSessionConnected(session);  
[csharp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. <span style="white-space:pre">  </span>    //输出客户端IP地址  
  2.             Console.Write("\r\n" + session.LocalEndPoint.Address.ToString() + ":连接");  
  3.         }  
  4.   
  5.         /// <summary>  
  6.         /// 输出断开连接信息  
  7.         /// </summary>  
  8.         /// <param name="session"></param>  
  9.         /// <param name="reason"></param>  
  10.         protected override void OnSessionClosed(MySession session, CloseReason reason)  
  11.         {  
  12.             base.OnSessionClosed(session, reason);  
  13. <span style="font-family: monospace; white-space: pre;">    </span><span style="font-family: monospace; white-space: pre; background-color: rgb(240, 240, 240);">    //输出客户端IP地址</span>  
  14.             Console.Write("\r\n" + session.LocalEndPoint.Address.ToString() + ":断开连接");  
  15.         }  
  16.   
  17.         protected override void OnStopped()  
  18.         {  
  19.             base.OnStopped();  
  20.             Console.WriteLine("服务器已停止");  
  21.         }  
  22.     }  
  23. }  

 

3.      创建自定义命令HELLO类,继承CommandBase并重写ExecuteCommand方法

[csharp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using SuperSocket.SocketBase;  
  6. using SuperSocket.SocketBase.Command;  
  7. using SuperSocket.SocketBase.Protocol;  
  8.   
  9. namespace SuperSocketApp1  
  10. {  
  11.     /// <summary>  
  12.     /// 自定义命令类HELLO,继承CommandBase,并传入自定义连接类MySession  
  13.     /// </summary>  
  14.     public class HELLO : CommandBase<MySession, StringRequestInfo>  
  15.     {  
  16.         /// <summary>  
  17.         /// 自定义执行命令方法,注意传入的变量session类型为MySession  
  18.         /// </summary>  
  19.         /// <param name="session"></param>  
  20.         /// <param name="requestInfo"></param>  
  21.         public override void ExecuteCommand(MySession session, StringRequestInfo requestInfo)  
  22.         {  
  23.             session.Send("Hello World!");  
  24.         }  
  25.     }  
  26. }  

 

4.      修改Main方法代码

[csharp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using SuperSocket;  
  6. using SuperSocket.Common;  
  7. using SuperSocket.SocketBase;  
  8. using SuperSocket.SocketEngine;  
  9. using SuperSocket.SocketBase.Protocol;  
  10.   
  11. namespace SuperSocketApp1  
  12. {  
  13.     class Program  
  14.     {  
  15.         static void Main(string[] args)  
  16.         {  
  17.   
  18.             var appServer = new MyServer();  
  19.   
  20.             //服务器端口  
  21.             int port = 2000;  
  22.   
  23.             //设置服务监听端口  
  24.             if (!appServer.Setup(port))  
  25.             {  
  26.                 Console.WriteLine("端口设置失败!");  
  27.                 Console.ReadKey();  
  28.                 return;  
  29.             }  
  30.   
  31.             //启动服务  
  32.             if (!appServer.Start())  
  33.             {  
  34.                 Console.WriteLine("启动服务失败!");  
  35.                 Console.ReadKey();  
  36.                 return;  
  37.             }  
  38.   
  39.             Console.WriteLine("启动服务成功,输入exit退出!");  
  40.   
  41.             while (true)  
  42.             {  
  43.                 var str = Console.ReadLine();  
  44.                 if (str.ToLower().Equals("exit"))  
  45.                 {  
  46.                     break;  
  47.                 }  
  48.             }  
  49.   
  50.             Console.WriteLine();  
  51.   
  52.             //停止服务  
  53.             appServer.Stop();  
  54.   
  55.             Console.WriteLine("服务已停止,按任意键退出!");  
  56.             Console.ReadKey();  
  57.         }  
  58.     }  
  59. }  

 

5.      程序结构如图

 

6.      创建多服务器提供不同服务的方法:按照上面的过程,创建不同的AppServer 、AppSession子类、自定义命令,并在程序入口中启动。


7.      注意:

     a) MyServer、自定义命令和MySession的访问权限必须设置为public

b) MyServer父类为AppServer<MySession>

c) MySession父类为AppSession<MySession>

d) HELLO父类为CommandBase<MySession,StringRequestInfo>,ExecueteCommand方法传入值类型分别为MySession和StringRequestInfo

e) 多服务器中需注意AppSession、AppServer、自定义命令中的AppSession不要搞错

//输出客户端IP地址

SuperSocket服务器架设(三):在SuperSocket中自定义Command、AppServer和AppSession