C# SuperSocket 手把手教你入门 傻瓜教程---7(自定义SuperSocket内置的命令行协议)
创始人
2024-03-27 07:44:21

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

C# SuperSocket 手把手教你入门 傻瓜教程---1(服务器单向接收客户端发送数据)

C# SuperSocket 手把手教你入门 傻瓜教程---2(服务器和客户端双向通信)

C# SuperSocket 手把手教你入门 傻瓜教程---3(Telnet服务器和客户端请求处理)

C# SuperSocket 手把手教你入门 傻瓜教程---4(创建一个服务器和多客户端双向通信程序)

C# SuperSocket 手把手教你入门 傻瓜教程---5(探索AppServer、AppSession,Conmmand)以及用配置文件App.comfig启动服务器 

C# SuperSocket 手把手教你入门 傻瓜教程---6(SuperSocket内置的命令行协议) 

 C# SuperSocket 手把手教你入门 傻瓜教程---7(自定义SuperSocket内置的命令行协议)

目录

一、前言

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

三、安装SuperSocket和SuperSocket.Engine 

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

2、安装SuperSocket

3、安装SuperSocket.Engine

四、自定义AppSession类

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

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

五、自定义AppServer类

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

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

六、使用Command

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

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

七、program.cs

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

1、SuperSocket配置section 

2、Server实例的配置 

九、验证

十、源程序

十一、致谢


一、前言

        上一篇文章C# SuperSocket 手把手教你入门 傻瓜教程---6(SuperSocket内置的命令行协议)_ba_wang_mao的博客-CSDN博客        我们分析了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内置的命令行协议。

 

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{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
{    ///   /// 自定义连接类SocketSession,继承AppSession,并传入到AppSession  ///   public class SocketSession : AppSession{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!");}///   /// 连接关闭  ///   ///   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);}///   /// 捕捉异常并输出  ///   ///   protected override void HandleException(Exception e){this.Send("error: {0}", e.Message);}}}

五、自定义AppServer类

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

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

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

2、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{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();}///   /// 输出新连接信息  ///   ///   protected override void OnNewSessionConnected(SocketSession session){base.OnNewSessionConnected(session);//输出客户端IP地址  Console.Write("\r\n" + session.LocalEndPoint.Address.ToString() + ":连接");}///   /// 输出断开连接信息  ///   ///   ///   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类。(注意:如果使用了自定义的Session,需要修改此处,如LOGIN类下的LOGIN:CommandBase)类),并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{///   /// 自定义执行命令方法,注意传入的变量session类型为MySession  ///   /// 会话  /// 请求数据信息  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可以灵活配置选项。

 

2、Server实例的配置 

  

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

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

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

ip: 侦听ip

port: 侦听端口

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

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


九、验证

1、启动服务器

        服务器启动成功。

 2、启动客户端

3、连接客户端

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

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

 

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

十、源程序

        源程序参见如下链接:

(5条消息) C#SuperSocket手把手教你入门傻瓜教程-7(自定义SuperSocket内置的命令行协议)-C#文档类资源-CSDN文库

        开发工具为:Visual Studio 2017 

十一、致谢

SuperSocket入门(四)-命令行协议 - 黄昏前黎明后 - 博客园 (cnblogs.com)

上一篇:接口多实现

下一篇:opencv基础-印度小哥

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...