[转] C# SuperSocket 手把手教你入门 傻瓜教程 7~8

7(自定义CommandLineProtocol---命令行协议)

 

目录

一、前言

二、创建一个自定义命令行协议的工程项目

三、安装SuperSocket和SuperSocket.Engine 

1、进入【管理NuGet程序包】

2、安装SuperSocket

3、安装SuperSocket.Engine

四、自定义AppSession类

1、工程项目中添加一个自定义类SocketSession类

2、SocketSession类完整的代码如下:

五、自定义AppServer类

1、工程项目中添加一个自定义类SocketServer

2、 SocketServer类添加自定义命令行协议的分隔符(冒号和逗号)

3、SocketServer类完整的代码如下:

六、使用Command

1、工程项目中添加一个自定义类LOGIN,处理Key为"LOGIN"的请求。

2、LOGIN类完整的代码如下:

七、program.cs

八、配置App.config使用BootStrap启动SuperSocket

1、SuperSocket配置section 

2、Server实例的配置 

九、验证



一、前言

        我们分析了SuperSocket内置命令行协议(CommandLineProtocol),它的特点如下:

1、SuperSocket命令行协议定义了每个请求必须以回车换行符( "\r\n")结尾

2、SuperSocket命令行协议将接收到的数据翻译成StringRequestInfo 实例

3、SuperSocket 内置的命令行协议用空格来分割请求的Key和参数部分。 

4、SuperSocket 内置的命令行协议的参数部分用空格来分割。

        在某些场景中:命令和参数,参数和参数之间的分隔符不是用空格,而是如下分隔符,例如:

"LOGIN:kerry,123,456,789" + 回车换行符

         即:(1)、冒号:来分割请求的Key和参数部分。

                (2)、逗号,来分割参数部分。

        在这种情况我们就需要重新设置CommandLineProtocol的CommandParser。SuperSocket内建的BasicCommandParser可以直接设置命令名和参数参数与参数之间分隔符。重置SuperSocket内置的命令行协议的分隔符就称之为自定义SuperSocket内置的命令行协议。

  1. namespace SuperSocketCustomCommandLineProtocol
  2. {
  3. public class SocketServer : AppServer<SocketSession>
  4. {
  5. public SocketServer()
  6. : base(new CommandLineReceiveFilterFactory(Encoding.Default, new BasicRequestInfoParser(":", ",")))
  7. {
  8. }
  9. }
  10. }

        下面我们详细分析如何进行自定义SuperSocket内置的命令行协议。

二、创建一个自定义命令行协议的工程项目

         新建一个SuperSocket服务器项目SuperSocketCustomCommandLineProtocol,参见下图。

三、安装SuperSocket和SuperSocket.Engine 

1、进入【管理NuGet程序包】

        鼠标右键单击【引用】,弹出下拉菜单,在下拉菜单中选中【管理NuGet程序包(N)】

2、安装SuperSocket

(1)、【浏览】选项卡下面的输入框中输入SuperSocket

(2)、过一会下面会出现"SuperSocket  ......下载 v1.6.6.1"

(3)、鼠标点击"SuperSocket  ......下载 v1.6.6.1",右边会出现"版本:最新稳定版1.6.6.1"

(4)、点击"版本:最新稳定版1.6.6.1"右边的【安装】按钮

3、安装SuperSocket.Engine

(1)、鼠标点击"SuperSocket.Engine ",右边会出现"版本:1.6.6.1"

(2)、点击"版本:1.6.6.1"右边的【安装】按钮

四、自定义AppSession类

        AppSession 代表一个和客户端的逻辑连接,基于连接的操作应该放在该类之中。你可以用该类的实例发送数据到客户端,接收客户端发送的数据或者关闭连接。

     使用方法:创建自定义类SocketSession,继承AppSession类并重写AppSession类的方法(注意:一个AppSession对象对应一个连接)

1、工程项目中添加一个自定义类SocketSession类

2、SocketSession类完整的代码如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using SuperSocket.Common;
  7. using SuperSocket.SocketBase;
  8. using SuperSocket.SocketBase.Protocol;
  9. using SuperSocket.SocketBase.Config;
  10. using SuperSocket.SocketEngine;
  11. namespace SuperSocketCustomCommandLineProtocol
  12. { /// <summary>
  13. /// 自定义连接类SocketSession,继承AppSession,并传入到AppSession
  14. /// </summary>
  15. public class SocketSession : AppSession<SocketSession>
  16. {
  17. public override void Send(string message)
  18. {
  19. Console.WriteLine("发送消息:" + message);
  20. base.Send(message);
  21. }
  22. protected override void OnSessionStarted()
  23. {
  24. //输出客户端IP地址
  25. Console.WriteLine(this.LocalEndPoint.Address.ToString());
  26. this.Send("Hello User,Welcome to SuperSocket Telnet Server!");
  27. }
  28. /// <summary>
  29. /// 连接关闭
  30. /// </summary>
  31. /// <param name="reason"></param>
  32. protected override void OnSessionClosed(CloseReason reason)
  33. {
  34. base.OnSessionClosed(reason);
  35. }
  36. protected override void HandleUnknownRequest(StringRequestInfo requestInfo)
  37. {
  38. Console.WriteLine($"遇到未知的请求 Key:" + requestInfo.Key + $" Body:" + requestInfo.Body);
  39. base.HandleUnknownRequest(requestInfo);
  40. }
  41. /// <summary>
  42. /// 捕捉异常并输出
  43. /// </summary>
  44. /// <param name="e"></param>
  45. protected override void HandleException(Exception e)
  46. {
  47. this.Send("error: {0}", e.Message);
  48. }
  49. }
  50. }

五、自定义AppServer类

        AppServer 代表了监听客户端连接,承载TCP连接的服务器实例。理想情况下,我们可以通过AppServer实例获取任何你想要的客户端连接,服务器级别的操作和逻辑应该定义在此类之中。

        使用方法:创建自定义类SocketServer,继承AppServer类并重写AppServer类的方法

1、工程项目中添加一个自定义类SocketServer

2、 SocketServer类添加自定义命令行协议的分隔符(冒号和逗号)

  1. public class SocketServer : AppServer<SocketSession>
  2. {
  3. public SocketServer()
  4. : base(new CommandLineReceiveFilterFactory(Encoding.Default, new BasicRequestInfoParser(":", ",")))
  5. {
  6. }

3、SocketServer类完整的代码如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using SuperSocket.Common;
  7. using SuperSocket.SocketBase;
  8. using SuperSocket.SocketBase.Protocol;
  9. using SuperSocket.SocketBase.Config;
  10. using SuperSocket.SocketEngine;
  11. namespace SuperSocketCustomCommandLineProtocol
  12. {
  13. public class SocketServer : AppServer<SocketSession>
  14. {
  15. public SocketServer()
  16. : base(new CommandLineReceiveFilterFactory(Encoding.Default, new BasicRequestInfoParser(":", ",")))
  17. {
  18. }
  19. protected override bool Setup(IRootConfig rootConfig, IServerConfig config)
  20. {
  21. Console.WriteLine("正在准备配置文件");
  22. return base.Setup(rootConfig, config);
  23. }
  24. protected override void OnStarted()
  25. {
  26. Console.WriteLine("服务已开始");
  27. base.OnStarted();
  28. }
  29. protected override void OnStopped()
  30. {
  31. Console.WriteLine("服务已停止");
  32. base.OnStopped();
  33. }
  34. /// <summary>
  35. /// 输出新连接信息
  36. /// </summary>
  37. /// <param name="session"></param>
  38. protected override void OnNewSessionConnected(SocketSession session)
  39. {
  40. base.OnNewSessionConnected(session);
  41. //输出客户端IP地址
  42. Console.Write("\r\n" + session.LocalEndPoint.Address.ToString() + ":连接");
  43. }
  44. /// <summary>
  45. /// 输出断开连接信息
  46. /// </summary>
  47. /// <param name="session"></param>
  48. /// <param name="reason"></param>
  49. protected override void OnSessionClosed(SocketSession session, CloseReason reason)
  50. {
  51. base.OnSessionClosed(session, reason);
  52. Console.Write("\r\n" + session.LocalEndPoint.Address.ToString() + ":断开连接");
  53. }
  54. }
  55. }

 警告: 自定义类SocketServer创建在根目录下,因此完整的路径是:

SuperSocketCustomCommandLineProtocol

六、使用Command

         在SuperSocket中的Command让我们进行扩展,使用方法也极其简单。只需要继承一个CommandBase<AppSession, StringRequestInfo>类。(注意:如果使用了自定义的Session,需要修改此处,如LOGIN类下的LOGIN:CommandBase<SocketSession, StringRequestInfo>)类),并override这个类ExecuteCommand方法。

1、工程项目中添加一个自定义类LOGIN,处理Key为"LOGIN"的请求。

2、LOGIN类完整的代码如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using SuperSocket.Common;
  7. using SuperSocket.SocketBase;
  8. using SuperSocket.SocketBase.Protocol;
  9. using SuperSocket.SocketBase.Command;
  10. namespace SuperSocketCustomCommandLineProtocol
  11. {
  12. public class LOGIN : CommandBase<SocketSession, StringRequestInfo>
  13. {
  14. /// <summary>
  15. /// 自定义执行命令方法,注意传入的变量session类型为MySession
  16. /// </summary>
  17. /// <param name="session">会话</param>
  18. /// <param name="requestInfo">请求数据信息</param>
  19. public override void ExecuteCommand(SocketSession session, StringRequestInfo requestInfo)
  20. {
  21. session.Send(string.Format("LOGIN {0}:{1} {2}", session.Config.Ip, session.Config.Port, requestInfo.Body));
  22. }
  23. }
  24. }

七、program.cs

        在program.cs类中改为使用App.config文件配置,用BootStrap启动服务器。

        警告:要想使用BootStrap启动服务器,必须引用

using SuperSocket.SocketEngine;

program类完整的代码如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using SuperSocket.Common;
  7. using SuperSocket.SocketBase;
  8. using SuperSocket.SocketBase.Protocol;
  9. using SuperSocket.SocketEngine;
  10. namespace SuperSocketCustomCommandLineProtocol
  11. {
  12. class Program
  13. {
  14. static void Main(string[] args)
  15. {
  16. Console.WriteLine("请按任何键进行启动SuperSocket服务!");
  17. Console.ReadKey();
  18. Console.WriteLine();
  19. var bootstrap = BootstrapFactory.CreateBootstrap();
  20. if (!bootstrap.Initialize())
  21. {
  22. Console.WriteLine("初始化失败!");
  23. Console.ReadKey();
  24. return;
  25. }
  26. var result = bootstrap.Start();
  27. Console.WriteLine("服务正在启动: {0}!", result);
  28. if (result == StartResult.Failed)
  29. {
  30. Console.WriteLine("服务启动失败!");
  31. Console.ReadKey();
  32. return;
  33. }
  34. Console.WriteLine("服务启动成功,请按'q'停止服务!");
  35. while (Console.ReadKey().KeyChar != 'q')
  36. {
  37. Console.WriteLine();
  38. continue;
  39. }
  40. //停止服务
  41. bootstrap.Stop();
  42. Console.WriteLine("服务已停止!");
  43. Console.ReadKey();
  44. }
  45. }
  46. }

八、配置App.config使用BootStrap启动SuperSocket


1、SuperSocket配置section 

        SuperSocket使用.NET自带的配置技术,SuperSocket有一个专门的配置Section,使用配置启动SuperSocket可以灵活配置选项。

  1. <configSections>
  2. <!--log 日志记录-->
  3. <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
  4. <!--SocketEngine-->
  5. <section name="superSocket" type="SuperSocket.SocketEngine.Configuration.SocketServiceConfig, SuperSocket.SocketEngine"/>
  6. </configSections>

2、Server实例的配置 

  1. <!--SuperSocket服务配置信息 serverType是项目的服务如我自定义的Socketserver-->
  2. <!--name: 实例名称
  3. serverType: 实例运行的AppServer类型
  4. ip: 侦听ip
  5. port: 侦听端口-->
  6. <superSocket>
  7. <servers>
  8. <!--textEncoding 编码方式"gb2312","utf-8" 默认是acii-->
  9. <server name="SuperSocketCustomCommandLineProtocol"
  10. textEncoding="gb2312"
  11. serverType="SuperSocketCustomCommandLineProtocol.SocketServer,SuperSocketCustomCommandLineProtocol"
  12. ip="Any"
  13. port="2017"
  14. maxConnectionNumber="100">
  15. </server>
  16. </servers>
  17. </superSocket>

这里解释一下配置的服务器节点:

name: 实例名称(工程项目的解决方案名称:SuperSocketCustomCommandLineProtocol

serverType: 实例运行的AppServer类型(就是之前我们创建的自定义AppServer类【SocketServer】,它创建在根目录下,因此的完整路径为:SuperSocketCustomCommandLineProtocol.SocketServer

ip: 侦听ip

port: 侦听端口

name: 实例名称  --->  SuperSocketCustomCommandLineProtocol
serverType:         --->  SuperSocketCustomCommandLineProtocol.SocketServer
ip: 侦听ip             --->  Any
port: 侦听端口     ---> 2017

完整的App.config配置文件如下所示:

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <configuration>
  3. <configSections>
  4. <!--log 日志记录-->
  5. <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
  6. <!--SocketEngine-->
  7. <section name="superSocket" type="SuperSocket.SocketEngine.Configuration.SocketServiceConfig, SuperSocket.SocketEngine"/>
  8. </configSections>
  9. <!--服务信息描述,在window服务模式下的名称标识-->
  10. <appSettings>
  11. <add key="ServiceName" value="SuperSocketCustomCommandLineProtocol"/>
  12. <add key="ServiceDescription" value="霸王猫"/>
  13. </appSettings>
  14. <!--SuperSocket服务配置信息 serverType是项目的服务如我自定义的Socketserver-->
  15. <!--name: 实例名称
  16. serverType: 实例运行的AppServer类型
  17. ip: 侦听ip
  18. port: 侦听端口-->
  19. <superSocket>
  20. <servers>
  21. <!--textEncoding 编码方式"gb2312","utf-8" 默认是acii-->
  22. <server name="SuperSocketCommandLineProtocol"
  23. textEncoding="gb2312"
  24. serverType="SuperSocketCustomCommandLineProtocol.SocketServer,SuperSocketCustomCommandLineProtocol"
  25. ip="Any"
  26. port="2017"
  27. maxConnectionNumber="100">
  28. </server>
  29. </servers>
  30. </superSocket>
  31. <startup>
  32. <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
  33. </startup>
  34. </configuration>

九、验证

1、启动服务器

        服务器启动成功。

 2、启动客户端

3、连接客户端

        连接客户端后,客户端收到服务器发送的信息:“Hello User,Welcome to SuperSocket Telnet Server!”

4、客户端发送字符串“LOGIN:kerry,123,456,789”+回车换行符

 

为了更好理解和明白,我们看一下调试的参数:

转自https://blog.csdn.net/ba_wang_mao/article/details/128237297?spm=1001.2014.3001.5502

8(TerminatorReceiveFilter - 结束符协议)

目录

  C# SuperSocket 手把手教你入门 傻瓜教程系列教程

一、前言

二、创建一个TerminatorReceiveFilter( 结束符协议)工程项目

三、安装SuperSocket和SuperSocket.Engine 

1、进入【管理NuGet程序包】

2、安装SuperSocket

3、安装SuperSocket.Engine

四、自定义AppSession类

1、工程项目中添加一个自定义类TerminatorProtocolSession类

2、TerminatorProtocolSession类完整的代码如下:

五、自定义AppServer类

1、工程项目中添加一个自定义类TerminatorProtocolServer​编辑

2、TerminatorProtocolServer类完整的代码如下:

六、使用Command

2、LOGIN类完整的代码如下:

七、program.cs

八、配置App.config使用BootStrap启动SuperSocket

1、SuperSocket配置section 

2、Server实例的配置 

九、验证


一、前言

        上一篇文章C# SuperSocket 手把手教你入门 傻瓜教程---6(SuperSocket内置的命令行协议)我们分析了SuperSocket内置命令行协议(CommandLineProtocol),它的特点如下:

1、SuperSocket命令行协议定义了每个请求必须以回车换行符( "\r\n")结尾。

2、SuperSocket命令行协议将接收到的数据翻译成StringRequestInfo 实例。

3、SuperSocket 内置的命令行协议用空格来分割请求的Key和参数部分。 

4、SuperSocket 内置的命令行协议的参数部分用空格来分割。

         上一篇文章

C# SuperSocket 手把手教你入门 傻瓜教程---7(自定义SuperSocket内置的命令行协议)我们分析了自定义SuperSocket内置命令行协议(CommandLineProtocol),它的特点如下:

1、可以修改命令和参数之间的分隔符为冒号:

2、可以修改参数和参数之间的分隔符为逗号,

        SuperSocket内置的常用协议实现模版如下:

  • TerminatorReceiveFilter (SuperSocket.SocketBase.Protocol.TerminatorReceiveFilter, SuperSocket.SocketBase)
  • CountSpliterReceiveFilter (SuperSocket.Facility.Protocol.CountSpliterReceiveFilter, SuperSocket.Facility)
  • FixedSizeReceiveFilter (SuperSocket.Facility.Protocol.FixedSizeReceiveFilter, SuperSocket.Facility)
  • BeginEndMarkReceiveFilter (SuperSocket.Facility.Protocol.BeginEndMarkReceiveFilter, SuperSocket.Facility)
  • FixedHeaderReceiveFilter (SuperSocket.Facility.Protocol.FixedHeaderReceiveFilter, SuperSocket.Facility)

        这一篇文章我们实现TerminatorReceiveFilter - 结束符协议,使用两个字符 "##" 作为结束符。(注:SuperSocket内置的默认命令行协议CommandLineProtocol使用回车换行符"\r\n"作为结束符)。

        实现TerminatorReceiveFilter - 结束符协议,我们只需要在自定义AppServer类中实现如下代码即可。

  1. /// <summary>
  2. /// TerminatorProtocolServer
  3. /// Each request end with the terminator "##"
  4. /// ECHO Your message##
  5. /// </summary>
  6. namespace SuperSocketTerminatorReceiveFilter
  7. {
  8. public class TerminatorProtocolServer : AppServer<TerminatorProtocolSession>
  9. {
  10. public TerminatorProtocolServer()
  11. : base(new TerminatorReceiveFilterFactory("##"))
  12. {
  13. }

二、创建一个TerminatorReceiveFilter( 结束符协议)工程项目

         新建一个SuperSocket服务器项目SuperSocketTerminatorReceiveFilter,参见下图。

三、安装SuperSocket和SuperSocket.Engine 

1、进入【管理NuGet程序包】

        鼠标右键单击【引用】,弹出下拉菜单,在下拉菜单中选中【管理NuGet程序包(N)】

2、安装SuperSocket

(1)、【浏览】选项卡下面的输入框中输入SuperSocket

(2)、过一会下面会出现"SuperSocket  ......下载 v1.6.6.1"

(3)、鼠标点击"SuperSocket  ......下载 v1.6.6.1",右边会出现"版本:最新稳定版1.6.6.1"

(4)、点击"版本:最新稳定版1.6.6.1"右边的【安装】按钮
 

3、安装SuperSocket.Engine

(1)、鼠标点击"SuperSocket.Engine ",右边会出现"版本:1.6.6.1"

(2)、点击"版本:1.6.6.1"右边的【安装】按钮

四、自定义AppSession类

        AppSession 代表一个和客户端的逻辑连接,基于连接的操作应该放在该类之中。你可以用该类的实例发送数据到客户端,接收客户端发送的数据或者关闭连接。

     使用方法:创建自定义类TerminatorProtocolSession,继承AppSession类并重写AppSession类的方法(注意:一个AppSession对象对应一个连接)

1、工程项目中添加一个自定义类TerminatorProtocolSession

2、TerminatorProtocolSession类完整的代码如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using SuperSocket.Common;
  7. using SuperSocket.SocketBase;
  8. using SuperSocket.SocketBase.Protocol;
  9. using SuperSocket.SocketBase.Config;
  10. using SuperSocket.SocketEngine;
  11. namespace SuperSocketTerminatorReceiveFilter
  12. {
  13. public class TerminatorProtocolSession : AppSession<TerminatorProtocolSession>
  14. {
  15. public override void Send(string message)
  16. {
  17. Console.WriteLine("发送消息:" + message);
  18. base.Send(message);
  19. }
  20. protected override void OnSessionStarted()
  21. {
  22. //输出客户端IP地址
  23. Console.WriteLine(this.LocalEndPoint.Address.ToString());
  24. this.Send("Hello User,Welcome to SuperSocket Telnet Server!");
  25. }
  26. /// <summary>
  27. /// 连接关闭
  28. /// </summary>
  29. /// <param name="reason"></param>
  30. protected override void OnSessionClosed(CloseReason reason)
  31. {
  32. base.OnSessionClosed(reason);
  33. }
  34. protected override void HandleUnknownRequest(StringRequestInfo requestInfo)
  35. {
  36. Console.WriteLine($"遇到未知的请求 Key:" + requestInfo.Key + $" Body:" + requestInfo.Body);
  37. base.HandleUnknownRequest(requestInfo);
  38. }
  39. /// <summary>
  40. /// 捕捉异常并输出
  41. /// </summary>
  42. /// <param name="e"></param>
  43. protected override void HandleException(Exception e)
  44. {
  45. this.Send("error: {0}", e.Message);
  46. }
  47. }
  48. }

 

五、自定义AppServer类

        AppServer 代表了监听客户端连接,承载TCP连接的服务器实例。理想情况下,我们可以通过AppServer实例获取任何你想要的客户端连接,服务器级别的操作和逻辑应该定义在此类之中。

        使用方法:创建自定义类TerminatorProtocolServer,继承AppServer类并重写AppServer类的方法

1、工程项目中添加一个自定义类TerminatorProtocolServer

2、TerminatorProtocolServer类完整的代码如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using SuperSocket.Common;
  7. using SuperSocket.SocketBase;
  8. using SuperSocket.SocketBase.Protocol;
  9. using SuperSocket.SocketBase.Config;
  10. using SuperSocket.SocketEngine;
  11. namespace SuperSocketTerminatorReceiveFilter
  12. {
  13. public class TerminatorProtocolServer : AppServer<TerminatorProtocolSession>
  14. {
  15. public TerminatorProtocolServer()
  16. : base(new TerminatorReceiveFilterFactory("##"))
  17. {
  18. }
  19. protected override bool Setup(IRootConfig rootConfig, IServerConfig config)
  20. {
  21. Console.WriteLine("正在准备配置文件");
  22. return base.Setup(rootConfig, config);
  23. }
  24. protected override void OnStarted()
  25. {
  26. Console.WriteLine("服务已开始");
  27. base.OnStarted();
  28. }
  29. protected override void OnStopped()
  30. {
  31. Console.WriteLine("服务已停止");
  32. base.OnStopped();
  33. }
  34. /// <summary>
  35. /// 输出新连接信息
  36. /// </summary>
  37. /// <param name="session"></param>
  38. protected override void OnNewSessionConnected(TerminatorProtocolSession session)
  39. {
  40. base.OnNewSessionConnected(session);
  41. //输出客户端IP地址
  42. Console.Write("\r\n" + session.LocalEndPoint.Address.ToString() + ":连接");
  43. }
  44. /// <summary>
  45. /// 输出断开连接信息
  46. /// </summary>
  47. /// <param name="session"></param>
  48. /// <param name="reason"></param>
  49. protected override void OnSessionClosed(TerminatorProtocolSession session, CloseReason reason)
  50. {
  51. base.OnSessionClosed(session, reason);
  52. Console.Write("\r\n" + session.LocalEndPoint.Address.ToString() + ":断开连接");
  53. }
  54. }
  55. }

        在自定义AppServer类(TerminatorProtocolServer)中实现如下代码即可实现TerminatorReceiveFilter - 结束符协议

  1. namespace SuperSocketTerminatorReceiveFilter
  2. {
  3. public class TerminatorProtocolServer : AppServer<TerminatorProtocolSession>
  4. {
  5. public TerminatorProtocolServer()
  6. : base(new TerminatorReceiveFilterFactory("##"))
  7. {
  8. }

警告: 自定义类TerminatorProtocolServer创建在根目录下,因此完整的路径是: 

SuperSocketTerminatorReceiveFilter.TerminatorProtocolServer

六、使用Command

         在SuperSocket中的Command让我们进行扩展,使用方法也极其简单。只需要继承一个CommandBase<AppSession, StringRequestInfo>类。(注意:如果使用了自定义的Session,需要修改此处,如LOGIN类下的LOGIN:CommandBase<SocketSession, StringRequestInfo>)类),并override这个类ExecuteCommand方法。

1、工程项目中添加一个自定义类LOGIN,处理Key为"LOGIN"的请求。

2、LOGIN类完整的代码如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using SuperSocket.Common;
  7. using SuperSocket.SocketBase;
  8. using SuperSocket.SocketBase.Protocol;
  9. using SuperSocket.SocketBase.Command;
  10. namespace SuperSocketTerminatorReceiveFilter
  11. {
  12. public class LOGIN : CommandBase<TerminatorProtocolSession, StringRequestInfo>
  13. {
  14. /// <summary>
  15. /// 自定义执行命令方法,注意传入的变量session类型为MySession
  16. /// </summary>
  17. /// <param name="session">会话</param>
  18. /// <param name="requestInfo">请求数据信息</param>
  19. public override void ExecuteCommand(TerminatorProtocolSession session, StringRequestInfo requestInfo)
  20. {
  21. session.Send(string.Format("LOGIN {0}:{1} {2}", session.Config.Ip, session.Config.Port, requestInfo.Body));
  22. }
  23. }
  24. }

 

七、program.cs

        在program.cs类中改为使用App.config文件配置,用BootStrap启动服务器。

        警告:要想使用BootStrap启动服务器,必须引用

using SuperSocket.SocketEngine;

 program类完整的代码如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using SuperSocket.Common;
  7. using SuperSocket.SocketBase;
  8. using SuperSocket.SocketBase.Protocol;
  9. using SuperSocket.SocketEngine;
  10. namespace SuperSocketTerminatorReceiveFilter
  11. {
  12. class Program
  13. {
  14. static void Main(string[] args)
  15. {
  16. Console.WriteLine("请按任何键进行启动SuperSocket服务!");
  17. Console.ReadKey();
  18. Console.WriteLine();
  19. var bootstrap = BootstrapFactory.CreateBootstrap();
  20. if (!bootstrap.Initialize())
  21. {
  22. Console.WriteLine("初始化失败!");
  23. Console.ReadKey();
  24. return;
  25. }
  26. var result = bootstrap.Start();
  27. Console.WriteLine("服务正在启动: {0}!", result);
  28. if (result == StartResult.Failed)
  29. {
  30. Console.WriteLine("服务启动失败!");
  31. Console.ReadKey();
  32. return;
  33. }
  34. Console.WriteLine("服务启动成功,请按'q'停止服务!");
  35. while (Console.ReadKey().KeyChar != 'q')
  36. {
  37. Console.WriteLine();
  38. continue;
  39. }
  40. //停止服务
  41. bootstrap.Stop();
  42. Console.WriteLine("服务已停止!");
  43. Console.ReadKey();
  44. }
  45. }
  46. }

八、配置App.config使用BootStrap启动SuperSocket

1、SuperSocket配置section 

        SuperSocket使用.NET自带的配置技术,SuperSocket有一个专门的配置Section,使用配置启动SuperSocket可以灵活配置选项。

  1. <configSections>
  2. <!--log 日志记录-->
  3. <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
  4. <!--SocketEngine-->
  5. <section name="superSocket" type="SuperSocket.SocketEngine.Configuration.SocketServiceConfig, SuperSocket.SocketEngine"/>
  6. </configSections>

2、Server实例的配置 

  1. <!--SuperSocket服务配置信息 serverType是项目的服务如我自定义的Socketserver-->
  2. <!--name: 实例名称
  3. serverType: 实例运行的AppServer类型
  4. ip: 侦听ip
  5. port: 侦听端口-->
  6. <superSocket>
  7. <servers>
  8. <!--textEncoding 编码方式"gb2312","utf-8" 默认是acii-->
  9. <server name="SuperSocketTerminatorReceiveFilter"
  10. textEncoding="gb2312"
  11. serverType="SuperSocketTerminatorReceiveFilter.TerminatorProtocolServer,SuperSocketTerminatorReceiveFilter"
  12. ip="Any"
  13. port="2017"
  14. maxConnectionNumber="100">
  15. </server>
  16. </servers>
  17. </superSocket>

这里解释一下配置的服务器节点:

name: 实例名称(工程项目的解决方案名称:SuperSocketTerminatorReceiveFilter)

serverType: 实例运行的AppServer类型(就是之前我们创建的自定义AppServer类【TerminatorProtocolServer】,它创建在根目录下,因此的完整路径为:SuperSocketTerminatorReceiveFilter.TerminatorProtocolServer)

ip: 侦听ip

port: 侦听端口

name: 实例名称  --->  SuperSocketTerminatorReceiveFilter
serverType:         --->  SuperSocketTerminatorReceiveFilter.TerminatorProtocolServer
ip: 侦听ip             --->  Any
port: 侦听端口     ---> 2017

完整的App.config配置文件如下所示:

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <configuration>
  3. <configSections>
  4. <!--log 日志记录-->
  5. <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
  6. <!--SocketEngine-->
  7. <section name="superSocket" type="SuperSocket.SocketEngine.Configuration.SocketServiceConfig, SuperSocket.SocketEngine"/>
  8. </configSections>
  9. <!--服务信息描述,在window服务模式下的名称标识-->
  10. <appSettings>
  11. <add key="ServiceName" value="SuperSocketTerminatorReceiveFilter"/>
  12. <add key="ServiceDescription" value="霸王猫"/>
  13. </appSettings>
  14. <!--SuperSocket服务配置信息 serverType是项目的服务如我自定义的Socketserver-->
  15. <!--name: 实例名称
  16. serverType: 实例运行的AppServer类型
  17. ip: 侦听ip
  18. port: 侦听端口-->
  19. <superSocket>
  20. <servers>
  21. <!--textEncoding 编码方式"gb2312","utf-8" 默认是acii-->
  22. <server name="SuperSocketTerminatorReceiveFilter"
  23. textEncoding="gb2312"
  24. serverType="SuperSocketTerminatorReceiveFilter.TerminatorProtocolServer,SuperSocketTerminatorReceiveFilter"
  25. ip="Any"
  26. port="2017"
  27. maxConnectionNumber="100">
  28. </server>
  29. </servers>
  30. </superSocket>
  31. <startup>
  32. <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
  33. </startup>
  34. </configuration>

九、验证

1、启动服务器

        服务器启动成功。

2、启动客户端

3、连接客户端

        连接客户端后,客户端收到服务器发送的信息:“Hello User,Welcome to SuperSocket Telnet Server!”

4、客户端发送字符串“LOGIN kerry 123 456 789”+"##"

 为了更好理解和明白,我们看一下调试的参数:

转自https://blog.csdn.net/ba_wang_mao/article/details/128251004?spm=1001.2014.3001.5502

posted @ 2023-07-19 10:18  CastleWu  阅读(509)  评论(0编辑  收藏  举报