[转] C# SuperSocket 手把手教你入门 傻瓜教程 7~8
7(自定义CommandLineProtocol---命令行协议)
目录
三、安装SuperSocket和SuperSocket.Engine
2、 SocketServer类添加自定义命令行协议的分隔符(冒号和逗号)
1、工程项目中添加一个自定义类LOGIN,处理Key为"LOGIN"的请求。
八、配置App.config使用BootStrap启动SuperSocket
一、前言
我们分析了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内置的命令行协议。
- namespace SuperSocketCustomCommandLineProtocol
- {
- public class SocketServer : AppServer<SocketSession>
- {
- public SocketServer()
- : base(new CommandLineReceiveFilterFactory(Encoding.Default, new BasicRequestInfoParser(":", ",")))
- {
-
- }
- }
- }
下面我们详细分析如何进行自定义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类完整的代码如下:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
-
- using SuperSocket.Common;
- using SuperSocket.SocketBase;
- using SuperSocket.SocketBase.Protocol;
- using SuperSocket.SocketBase.Config;
- using SuperSocket.SocketEngine;
-
-
- namespace SuperSocketCustomCommandLineProtocol
- { /// <summary>
- /// 自定义连接类SocketSession,继承AppSession,并传入到AppSession
- /// </summary>
- public class SocketSession : AppSession<SocketSession>
- {
- public override void Send(string message)
- {
- Console.WriteLine("发送消息:" + message);
- base.Send(message);
- }
-
-
- protected override void OnSessionStarted()
- {
- //输出客户端IP地址
- Console.WriteLine(this.LocalEndPoint.Address.ToString());
- this.Send("Hello User,Welcome to SuperSocket Telnet Server!");
- }
-
-
- /// <summary>
- /// 连接关闭
- /// </summary>
- /// <param name="reason"></param>
- protected override void OnSessionClosed(CloseReason reason)
- {
- base.OnSessionClosed(reason);
- }
-
-
- protected override void HandleUnknownRequest(StringRequestInfo requestInfo)
- {
- Console.WriteLine($"遇到未知的请求 Key:" + requestInfo.Key + $" Body:" + requestInfo.Body);
- base.HandleUnknownRequest(requestInfo);
- }
-
- /// <summary>
- /// 捕捉异常并输出
- /// </summary>
- /// <param name="e"></param>
- protected override void HandleException(Exception e)
- {
- this.Send("error: {0}", e.Message);
- }
- }
-
- }
五、自定义AppServer类
AppServer 代表了监听客户端连接,承载TCP连接的服务器实例。理想情况下,我们可以通过AppServer实例获取任何你想要的客户端连接,服务器级别的操作和逻辑应该定义在此类之中。
使用方法:创建自定义类SocketServer,继承AppServer类并重写AppServer类的方法
1、工程项目中添加一个自定义类SocketServer
2、 SocketServer类添加自定义命令行协议的分隔符(冒号和逗号)
- public class SocketServer : AppServer<SocketSession>
- {
- public SocketServer()
- : base(new CommandLineReceiveFilterFactory(Encoding.Default, new BasicRequestInfoParser(":", ",")))
- {
-
- }
3、SocketServer类完整的代码如下:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
-
- using SuperSocket.Common;
- using SuperSocket.SocketBase;
- using SuperSocket.SocketBase.Protocol;
- using SuperSocket.SocketBase.Config;
- using SuperSocket.SocketEngine;
-
-
- namespace SuperSocketCustomCommandLineProtocol
- {
- public class SocketServer : AppServer<SocketSession>
- {
- public SocketServer()
- : base(new CommandLineReceiveFilterFactory(Encoding.Default, new BasicRequestInfoParser(":", ",")))
- {
-
- }
-
- protected override bool Setup(IRootConfig rootConfig, IServerConfig config)
- {
- Console.WriteLine("正在准备配置文件");
- return base.Setup(rootConfig, config);
- }
-
- protected override void OnStarted()
- {
- Console.WriteLine("服务已开始");
- base.OnStarted();
- }
-
- protected override void OnStopped()
- {
- Console.WriteLine("服务已停止");
- base.OnStopped();
- }
-
- /// <summary>
- /// 输出新连接信息
- /// </summary>
- /// <param name="session"></param>
- protected override void OnNewSessionConnected(SocketSession session)
- {
- base.OnNewSessionConnected(session);
- //输出客户端IP地址
- Console.Write("\r\n" + session.LocalEndPoint.Address.ToString() + ":连接");
- }
-
-
- /// <summary>
- /// 输出断开连接信息
- /// </summary>
- /// <param name="session"></param>
- /// <param name="reason"></param>
- protected override void OnSessionClosed(SocketSession session, CloseReason reason)
- {
- base.OnSessionClosed(session, reason);
- Console.Write("\r\n" + session.LocalEndPoint.Address.ToString() + ":断开连接");
- }
- }
- }
警告: 自定义类SocketServer创建在根目录下,因此完整的路径是:
SuperSocketCustomCommandLineProtocol
六、使用Command
在SuperSocket中的Command让我们进行扩展,使用方法也极其简单。只需要继承一个CommandBase<AppSession, StringRequestInfo>类。(注意:如果使用了自定义的Session,需要修改此处,如LOGIN类下的LOGIN:CommandBase<SocketSession, StringRequestInfo>)类),并override这个类ExecuteCommand方法。
1、工程项目中添加一个自定义类LOGIN,处理Key为"LOGIN"的请求。
2、LOGIN类完整的代码如下:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
-
- using SuperSocket.Common;
- using SuperSocket.SocketBase;
- using SuperSocket.SocketBase.Protocol;
- using SuperSocket.SocketBase.Command;
-
-
- namespace SuperSocketCustomCommandLineProtocol
- {
- public class LOGIN : CommandBase<SocketSession, StringRequestInfo>
- {
- /// <summary>
- /// 自定义执行命令方法,注意传入的变量session类型为MySession
- /// </summary>
- /// <param name="session">会话</param>
- /// <param name="requestInfo">请求数据信息</param>
- public override void ExecuteCommand(SocketSession session, StringRequestInfo requestInfo)
- {
- session.Send(string.Format("LOGIN {0}:{1} {2}", session.Config.Ip, session.Config.Port, requestInfo.Body));
- }
- }
-
- }
七、program.cs
在program.cs类中改为使用App.config文件配置,用BootStrap启动服务器。
警告:要想使用BootStrap启动服务器,必须引用
using SuperSocket.SocketEngine;
program类完整的代码如下:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
-
- using SuperSocket.Common;
- using SuperSocket.SocketBase;
- using SuperSocket.SocketBase.Protocol;
- using SuperSocket.SocketEngine;
-
-
- namespace SuperSocketCustomCommandLineProtocol
- {
- class Program
- {
- static void Main(string[] args)
- {
- Console.WriteLine("请按任何键进行启动SuperSocket服务!");
- Console.ReadKey();
- Console.WriteLine();
- var bootstrap = BootstrapFactory.CreateBootstrap();
-
- if (!bootstrap.Initialize())
- {
- Console.WriteLine("初始化失败!");
- Console.ReadKey();
- return;
- }
-
- var result = bootstrap.Start();
-
- Console.WriteLine("服务正在启动: {0}!", result);
-
- if (result == StartResult.Failed)
- {
- Console.WriteLine("服务启动失败!");
- Console.ReadKey();
- return;
- }
- Console.WriteLine("服务启动成功,请按'q'停止服务!");
-
- while (Console.ReadKey().KeyChar != 'q')
- {
- Console.WriteLine();
- continue;
- }
-
- //停止服务
- bootstrap.Stop();
- Console.WriteLine("服务已停止!");
- Console.ReadKey();
- }
- }
- }
-
八、配置App.config使用BootStrap启动SuperSocket
1、SuperSocket配置section
SuperSocket使用.NET自带的配置技术,SuperSocket有一个专门的配置Section,使用配置启动SuperSocket可以灵活配置选项。
- <configSections>
- <!--log 日志记录-->
- <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
- <!--SocketEngine-->
- <section name="superSocket" type="SuperSocket.SocketEngine.Configuration.SocketServiceConfig, SuperSocket.SocketEngine"/>
- </configSections>
2、Server实例的配置
- <!--SuperSocket服务配置信息 serverType是项目的服务如我自定义的Socketserver-->
- <!--name: 实例名称
- serverType: 实例运行的AppServer类型
- ip: 侦听ip
- port: 侦听端口-->
- <superSocket>
- <servers>
- <!--textEncoding 编码方式"gb2312","utf-8" 默认是acii-->
- <server name="SuperSocketCustomCommandLineProtocol"
- textEncoding="gb2312"
- serverType="SuperSocketCustomCommandLineProtocol.SocketServer,SuperSocketCustomCommandLineProtocol"
- ip="Any"
- port="2017"
- maxConnectionNumber="100">
- </server>
- </servers>
- </superSocket>
这里解释一下配置的服务器节点:
name: 实例名称(工程项目的解决方案名称:SuperSocketCustomCommandLineProtocol)
serverType: 实例运行的AppServer类型(就是之前我们创建的自定义AppServer类【SocketServer】,它创建在根目录下,因此的完整路径为:SuperSocketCustomCommandLineProtocol.SocketServer)
ip: 侦听ip
port: 侦听端口
name: 实例名称 ---> SuperSocketCustomCommandLineProtocol
serverType: ---> SuperSocketCustomCommandLineProtocol.SocketServer
ip: 侦听ip ---> Any
port: 侦听端口 ---> 2017
完整的App.config配置文件如下所示:
- <?xml version="1.0" encoding="utf-8" ?>
- <configuration>
-
- <configSections>
- <!--log 日志记录-->
- <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
- <!--SocketEngine-->
- <section name="superSocket" type="SuperSocket.SocketEngine.Configuration.SocketServiceConfig, SuperSocket.SocketEngine"/>
- </configSections>
-
-
- <!--服务信息描述,在window服务模式下的名称标识-->
- <appSettings>
- <add key="ServiceName" value="SuperSocketCustomCommandLineProtocol"/>
- <add key="ServiceDescription" value="霸王猫"/>
- </appSettings>
-
-
- <!--SuperSocket服务配置信息 serverType是项目的服务如我自定义的Socketserver-->
- <!--name: 实例名称
- serverType: 实例运行的AppServer类型
- ip: 侦听ip
- port: 侦听端口-->
- <superSocket>
- <servers>
- <!--textEncoding 编码方式"gb2312","utf-8" 默认是acii-->
- <server name="SuperSocketCommandLineProtocol"
- textEncoding="gb2312"
- serverType="SuperSocketCustomCommandLineProtocol.SocketServer,SuperSocketCustomCommandLineProtocol"
- ip="Any"
- port="2017"
- maxConnectionNumber="100">
- </server>
- </servers>
- </superSocket>
-
-
- <startup>
- <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
- </startup>
- </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.55028(TerminatorReceiveFilter - 结束符协议)
目录
C# SuperSocket 手把手教你入门 傻瓜教程系列教程
二、创建一个TerminatorReceiveFilter( 结束符协议)工程项目
三、安装SuperSocket和SuperSocket.Engine
1、工程项目中添加一个自定义类TerminatorProtocolSession类
2、TerminatorProtocolSession类完整的代码如下:
1、工程项目中添加一个自定义类TerminatorProtocolServer编辑
2、TerminatorProtocolServer类完整的代码如下:
八、配置App.config使用BootStrap启动SuperSocket
一、前言
上一篇文章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类中实现如下代码即可。
- /// <summary>
- /// TerminatorProtocolServer
- /// Each request end with the terminator "##"
- /// ECHO Your message##
- /// </summary>
-
- namespace SuperSocketTerminatorReceiveFilter
- {
- public class TerminatorProtocolServer : AppServer<TerminatorProtocolSession>
- {
-
- public TerminatorProtocolServer()
- : base(new TerminatorReceiveFilterFactory("##"))
- {
-
- }
二、创建一个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类完整的代码如下:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
-
-
- using SuperSocket.Common;
- using SuperSocket.SocketBase;
- using SuperSocket.SocketBase.Protocol;
- using SuperSocket.SocketBase.Config;
- using SuperSocket.SocketEngine;
-
-
-
- namespace SuperSocketTerminatorReceiveFilter
- {
- public class TerminatorProtocolSession : AppSession<TerminatorProtocolSession>
- {
- public override void Send(string message)
- {
- Console.WriteLine("发送消息:" + message);
- base.Send(message);
- }
-
- protected override void OnSessionStarted()
- {
- //输出客户端IP地址
- Console.WriteLine(this.LocalEndPoint.Address.ToString());
- this.Send("Hello User,Welcome to SuperSocket Telnet Server!");
- }
-
-
- /// <summary>
- /// 连接关闭
- /// </summary>
- /// <param name="reason"></param>
- protected override void OnSessionClosed(CloseReason reason)
- {
- base.OnSessionClosed(reason);
- }
-
-
- protected override void HandleUnknownRequest(StringRequestInfo requestInfo)
- {
- Console.WriteLine($"遇到未知的请求 Key:" + requestInfo.Key + $" Body:" + requestInfo.Body);
- base.HandleUnknownRequest(requestInfo);
- }
-
- /// <summary>
- /// 捕捉异常并输出
- /// </summary>
- /// <param name="e"></param>
- protected override void HandleException(Exception e)
- {
- this.Send("error: {0}", e.Message);
- }
- }
- }
五、自定义AppServer类
AppServer 代表了监听客户端连接,承载TCP连接的服务器实例。理想情况下,我们可以通过AppServer实例获取任何你想要的客户端连接,服务器级别的操作和逻辑应该定义在此类之中。
使用方法:创建自定义类TerminatorProtocolServer,继承AppServer类并重写AppServer类的方法
1、工程项目中添加一个自定义类TerminatorProtocolServer
2、TerminatorProtocolServer类完整的代码如下:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
-
- using SuperSocket.Common;
- using SuperSocket.SocketBase;
- using SuperSocket.SocketBase.Protocol;
- using SuperSocket.SocketBase.Config;
- using SuperSocket.SocketEngine;
-
-
- namespace SuperSocketTerminatorReceiveFilter
- {
- public class TerminatorProtocolServer : AppServer<TerminatorProtocolSession>
- {
- public TerminatorProtocolServer()
- : base(new TerminatorReceiveFilterFactory("##"))
- {
-
- }
-
- protected override bool Setup(IRootConfig rootConfig, IServerConfig config)
- {
- Console.WriteLine("正在准备配置文件");
- return base.Setup(rootConfig, config);
- }
-
- protected override void OnStarted()
- {
- Console.WriteLine("服务已开始");
- base.OnStarted();
- }
-
- protected override void OnStopped()
- {
- Console.WriteLine("服务已停止");
- base.OnStopped();
- }
-
- /// <summary>
- /// 输出新连接信息
- /// </summary>
- /// <param name="session"></param>
- protected override void OnNewSessionConnected(TerminatorProtocolSession session)
- {
- base.OnNewSessionConnected(session);
- //输出客户端IP地址
- Console.Write("\r\n" + session.LocalEndPoint.Address.ToString() + ":连接");
- }
-
-
- /// <summary>
- /// 输出断开连接信息
- /// </summary>
- /// <param name="session"></param>
- /// <param name="reason"></param>
- protected override void OnSessionClosed(TerminatorProtocolSession session, CloseReason reason)
- {
- base.OnSessionClosed(session, reason);
- Console.Write("\r\n" + session.LocalEndPoint.Address.ToString() + ":断开连接");
- }
- }
- }
在自定义AppServer类(TerminatorProtocolServer类)中实现如下代码即可实现TerminatorReceiveFilter - 结束符协议。
- namespace SuperSocketTerminatorReceiveFilter
- {
- public class TerminatorProtocolServer : AppServer<TerminatorProtocolSession>
- {
- public TerminatorProtocolServer()
- : base(new TerminatorReceiveFilterFactory("##"))
- {
-
- }
警告: 自定义类TerminatorProtocolServer创建在根目录下,因此完整的路径是:
SuperSocketTerminatorReceiveFilter.TerminatorProtocolServer
六、使用Command
在SuperSocket中的Command让我们进行扩展,使用方法也极其简单。只需要继承一个CommandBase<AppSession, StringRequestInfo>类。(注意:如果使用了自定义的Session,需要修改此处,如LOGIN类下的LOGIN:CommandBase<SocketSession, StringRequestInfo>)类),并override这个类ExecuteCommand方法。
1、工程项目中添加一个自定义类LOGIN,处理Key为"LOGIN"的请求。
2、LOGIN类完整的代码如下:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
-
-
- using SuperSocket.Common;
- using SuperSocket.SocketBase;
- using SuperSocket.SocketBase.Protocol;
- using SuperSocket.SocketBase.Command;
-
-
- namespace SuperSocketTerminatorReceiveFilter
- {
- public class LOGIN : CommandBase<TerminatorProtocolSession, StringRequestInfo>
- {
- /// <summary>
- /// 自定义执行命令方法,注意传入的变量session类型为MySession
- /// </summary>
- /// <param name="session">会话</param>
- /// <param name="requestInfo">请求数据信息</param>
- public override void ExecuteCommand(TerminatorProtocolSession session, StringRequestInfo requestInfo)
- {
- session.Send(string.Format("LOGIN {0}:{1} {2}", session.Config.Ip, session.Config.Port, requestInfo.Body));
- }
- }
- }
七、program.cs
在program.cs类中改为使用App.config文件配置,用BootStrap启动服务器。
警告:要想使用BootStrap启动服务器,必须引用
using SuperSocket.SocketEngine;
program类完整的代码如下:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
-
- using SuperSocket.Common;
- using SuperSocket.SocketBase;
- using SuperSocket.SocketBase.Protocol;
- using SuperSocket.SocketEngine;
-
-
- namespace SuperSocketTerminatorReceiveFilter
- {
- class Program
- {
- static void Main(string[] args)
- {
- Console.WriteLine("请按任何键进行启动SuperSocket服务!");
- Console.ReadKey();
- Console.WriteLine();
- var bootstrap = BootstrapFactory.CreateBootstrap();
-
- if (!bootstrap.Initialize())
- {
- Console.WriteLine("初始化失败!");
- Console.ReadKey();
- return;
- }
-
- var result = bootstrap.Start();
-
- Console.WriteLine("服务正在启动: {0}!", result);
-
- if (result == StartResult.Failed)
- {
- Console.WriteLine("服务启动失败!");
- Console.ReadKey();
- return;
- }
- Console.WriteLine("服务启动成功,请按'q'停止服务!");
-
- while (Console.ReadKey().KeyChar != 'q')
- {
- Console.WriteLine();
- continue;
- }
-
- //停止服务
- bootstrap.Stop();
- Console.WriteLine("服务已停止!");
- Console.ReadKey();
- }
- }
- }
八、配置App.config使用BootStrap启动SuperSocket
1、SuperSocket配置section
SuperSocket使用.NET自带的配置技术,SuperSocket有一个专门的配置Section,使用配置启动SuperSocket可以灵活配置选项。
- <configSections>
- <!--log 日志记录-->
- <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
- <!--SocketEngine-->
- <section name="superSocket" type="SuperSocket.SocketEngine.Configuration.SocketServiceConfig, SuperSocket.SocketEngine"/>
- </configSections>
2、Server实例的配置
- <!--SuperSocket服务配置信息 serverType是项目的服务如我自定义的Socketserver-->
- <!--name: 实例名称
- serverType: 实例运行的AppServer类型
- ip: 侦听ip
- port: 侦听端口-->
- <superSocket>
- <servers>
- <!--textEncoding 编码方式"gb2312","utf-8" 默认是acii-->
- <server name="SuperSocketTerminatorReceiveFilter"
- textEncoding="gb2312"
- serverType="SuperSocketTerminatorReceiveFilter.TerminatorProtocolServer,SuperSocketTerminatorReceiveFilter"
- ip="Any"
- port="2017"
- maxConnectionNumber="100">
- </server>
- </servers>
- </superSocket>
这里解释一下配置的服务器节点:
name: 实例名称(工程项目的解决方案名称:SuperSocketTerminatorReceiveFilter)
serverType: 实例运行的AppServer类型(就是之前我们创建的自定义AppServer类【TerminatorProtocolServer】,它创建在根目录下,因此的完整路径为:SuperSocketTerminatorReceiveFilter.TerminatorProtocolServer)
ip: 侦听ip
port: 侦听端口
name: 实例名称 ---> SuperSocketTerminatorReceiveFilter
serverType: ---> SuperSocketTerminatorReceiveFilter.TerminatorProtocolServer
ip: 侦听ip ---> Any
port: 侦听端口 ---> 2017
完整的App.config配置文件如下所示:
- <?xml version="1.0" encoding="utf-8" ?>
- <configuration>
-
- <configSections>
- <!--log 日志记录-->
- <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
- <!--SocketEngine-->
- <section name="superSocket" type="SuperSocket.SocketEngine.Configuration.SocketServiceConfig, SuperSocket.SocketEngine"/>
- </configSections>
-
-
- <!--服务信息描述,在window服务模式下的名称标识-->
- <appSettings>
- <add key="ServiceName" value="SuperSocketTerminatorReceiveFilter"/>
- <add key="ServiceDescription" value="霸王猫"/>
- </appSettings>
-
-
- <!--SuperSocket服务配置信息 serverType是项目的服务如我自定义的Socketserver-->
- <!--name: 实例名称
- serverType: 实例运行的AppServer类型
- ip: 侦听ip
- port: 侦听端口-->
- <superSocket>
- <servers>
- <!--textEncoding 编码方式"gb2312","utf-8" 默认是acii-->
- <server name="SuperSocketTerminatorReceiveFilter"
- textEncoding="gb2312"
- serverType="SuperSocketTerminatorReceiveFilter.TerminatorProtocolServer,SuperSocketTerminatorReceiveFilter"
- ip="Any"
- port="2017"
- maxConnectionNumber="100">
- </server>
- </servers>
- </superSocket>
-
-
- <startup>
- <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
- </startup>
- </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