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

news2024/11/18 7:40:43

 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<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类完整的代码如下:

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”+回车换行符

 

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

十、源程序

        源程序参见如下链接:

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

        开发工具为:Visual Studio 2017 

十一、致谢

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/72715.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

黑马程序员14套经典IT教程+面试宝典

很多同学对互联网比较感兴趣 &#xff0c;奈何苦恼不知道如何入门。今天免费给大家分享一波&#xff0c;黑马程序员14套经典IT教程程序员面试宝典&#xff01;涉及Java、前端、Python、大数据、软件测试、UI设计、新媒体短视频等。从厌学到学嗨&#xff0c;你只差一套黑马教程&…

ADS1120 备忘

ADS1120 是一个小型、低功耗、16-bit、ΔΣ 模数转换器&#xff08;ADC&#xff09;&#xff1a; 内置 PGA&#xff08;1~128&#xff09;内置参考基准&#xff08;2.048V&#xff09;内置温度传感器内置 2 个已配对的可编程电流源SPI 通讯接口&#xff0c;使用 模式 1 &#…

BHAR事件研究方法stata代码和案例数据

BHAR事件研究方法stata代码和案例数据 1、方法说明&#xff1a; BHAR (Buy and Hold Abnormal Return)&#xff0c;即购入 -持有异常收益法。 无论是短期事件研究,还是长期事件研究,都包含以下六大步骤&#xff0c;即定义事件以及事件研究窗口、选择研究样本、选择望收益模型…

web安全之Webshell管理工具

目录 漏洞原理 工具 中国蚁剑(antsword) weevely(kali) godzilla Behinder 漏洞原理 上传PHP一句话木马到服务器 <?phpheader("Content-type:text/html;charsetgb1232");echo "<pre>";eval($_POST[coleak]); ?> 找到上传路径后通过…

PTE考试写作教程

PTE考试写作教程 由经验丰富的母语教师完成准备教程&#xff0c;以在 PTE 考试的写作部分取得成功 课程英文名&#xff1a;PTE Academic Exam Preparation Writing Mastery (Achieve 79) 此视频教程共10.0小时&#xff0c;中英双语字幕&#xff0c;画质清晰无水印&#xff0…

《MySQL实战45讲》——学习笔记21 “加锁规则、加锁案例、死锁示例“

紧接着上篇介绍可重复读隔离级别下的幻读问题及解决幻读引入的间隙锁和next-key lock的概念&#xff0c;本篇介绍了更新记录时加锁的规则&#xff0c;并用几个案例来说明规则&#xff1b; 通过学习本文&#xff0c;可以帮助通过加锁规则去判断语句的加锁范围&#xff1b;在业务…

ABAP学习笔记之——第九章:ABAP对象

一、类 类(Class)可看做是对象的骨骼 (Template) 或者对象的类型。另外&#xff0c;类是抽象化对象的明细表。即可以说是制作对象的设计书。对象属性由描述对象的状态和行为的构成要素Component)决定。 比较结构化程序和面向对象程序 例&#xff1a; *比较结构化程序 和 面向…

Apache+PHP+MariaDB+MQTT重启指令

启动PHP服务 1.启动 systemctl start php-fpm.service Apache服务 1. 启动、终止、重启 systemctl start httpd.service #启动 systemctl stop httpd.service #停止 systemctl restart httpd.service #重启 2. 设置开机启动/关闭 systemctl enable httpd.service #开机…

Spring【日志文件的打印与输出】

Spring【日志文件的打印与输出】&#x1f34e;一.日志文件&#x1f352;1.1 日志的作用&#x1f352;1.2 怎样查看到日志信息&#x1f34e;二. 打印日志&#x1f352;2.1 自定义打印日志&#x1f352;2.2 ⽇志格式说明&#x1f34e;三.日志级别&#x1f352;3.1 日志级别的作用…

SpringMVC的收参方式?

第一种收取参数方式&#xff1a;数据类型收取参数 第二种收取参数的方式&#xff1a;实体类收取参数&#xff08;传参&#xff09; 第三种收取参数的方式&#xff1a;ajax 收取数组/集合 第四种收取参数的方式&#xff1a;ajax 接收json数据 第五种收取参数的方式&#xff1a;…

全网最牛最全Postman接口测试(五): postman设置接口关联,postman实现参数化

Postman(9): postman设置接口关联 postman设置接口关联 在实际的接口测试中&#xff0c;后一个接口经常需要用到前一个接口返回的结果&#xff0c; 从而让后一个接口能正常执行&#xff0c;这个过程的实现称为关联。 在postman中实现关联操作的步骤如下&#xff1a; 1、利用…

怎样避免软件测试中的漏测

什么是测试漏测&#xff1f; 测试漏测是指软件产品在测试结束后出现了在测试过程中没有被发现的bug。我们知道&#xff0c;漏测是每一个软件测试者最头疼的事&#xff0c;一旦出现漏测&#xff0c;首先给客户带来了非常不好的影响&#xff0c;特别是严重的功能性bug被漏测&…

程序员如何创造睡后收入呢?

程序员作为一个互联网行业的职业&#xff0c;在互联网当道的现在是非常吃香的。 作为程序员&#xff0c;一个基础工资的收入就已经是一笔不菲的收益了。 然而&#xff0c;钱总是不够花的&#xff0c;毕竟捂住口袋有点小难。 这时候&#xff0c;我们只好把视线转向另一边&…

算法面试题——删除链表后第N个节点

给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5] 示例 2&#xff1a; 输入&#xff1a;head [1], n 1 输出&#xff1a;[] 示例 3&#xff…

C语言百日刷题第十三天

前言 今天是刷题第13天&#xff0c;放弃不难&#xff0c;但坚持一定很酷~ 临近期末&#xff0c;再刷一套模拟题 C语言百日刷题第十三天前言选择题判断题编程题选择题 1.若由定义int*p1,*p2,m5,n;以下赋值语句都正确的选项是&#xff08;&#xff09; A、p1&m;p2&n…

signintech/gopdf功能介绍与代码示例

signintech/gopdf功能介绍与代码示例 PDF相关常识以及signintech/gopdf功能概览 代码示例&#xff1a; 参考&#xff1a;https://gitee.com/ixuer/gopdf_example 代码示例包括&#xff1a; 设置页面配置&#xff0c;如宽度和高度。test/font: 添加ttf字体&#xff0c;并设置…

计算机毕业设计springboot+vue基本微信小程序的快递收发小程序

项目介绍 随着Internet的发展,人们的日常生活已经离不开网络。未来人们的生活与工作将变得越来越数字化、网络化和电子化。本文以实际运用为开发背景,运用软件工程原理和开发方法,它主要是采用java语言技术、springboot框架和微信小程序来完成对系统的设计。整个开发过程首先对…

element-ui的Dropdown下拉菜单,传递多个参数

element-ui的Dropdown下拉菜单&#xff0c;传递多个参数 原因&#xff1a; Dropdown下拉菜单只允许我们传递一个参数 解决步骤: 在允许我们传递一个参数的哪里提前调用方法: 以前&#xff1a;<el-dropdown-item command"a"> 测试 </el-dropdown-item> 现…

一文揭密字节跳动薪资职级,资深测试开发居然能拿......

曾经的互联网是PC的时代&#xff0c;随着智能手机的普及&#xff0c;移动互联网开始飞速崛起。而字节跳动抓住了这波机遇&#xff0c;2015年&#xff0c;字节跳动全面加码短视频&#xff0c;从那以后&#xff0c;抖音成为了字节跳动用户、收入和估值的最大增长引擎。 自从字节逐…

Docker 基础和常用命令总结

一&#xff0c;Docker 简介 1.1&#xff0c;什么是 Docker1.2&#xff0c;Docker 与虚拟机的区别1.3&#xff0c;Docker 架构1.4&#xff0c;为什么用 Docker 二&#xff0c;Docker 基本概念 2.1&#xff0c;镜像2.2&#xff0c;容器2.3&#xff0c;仓库 三&#xff0c;Docker …