C# SuperSocket 手把手教你入门 傻瓜教程---10(CountSpliterReceiveFilter - 固定数量分隔符协议)不使用COMMAND

   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(CommandLineProtocol---命令行协议)

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

 C# SuperSocket 手把手教你入门 傻瓜教程-8(TerminatorReceiveFilter - 结束符协议)

C# SuperSocket 手把手教你入门 傻瓜教程---9(CountSpliterReceiveFilter - 固定数量分隔符协议)使用COMMAND

C# SuperSocket 手把手教你入门 傻瓜教程---10(CountSpliterReceiveFilter - 固定数量分隔符协议)不使用COMMAND

目录

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

一、前言 

二、创建一个CountSpliterReceiveFilter( 固定数量分隔符协议)工程项目

三、安装SuperSocket和SuperSocket.Engine 

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

2、安装SuperSocket

3、安装SuperSocket.Engine

四、自定义AppSession类

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

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

五、自定义AppServer类

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

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

六、program.cs

七、验证

八、源程序

九、致谢


一、前言 

        上一篇文章(1条消息) C# SuperSocket 手把手教你入门 傻瓜教程---9(CountSpliterReceiveFilter - 固定数量分隔符协议)使用COMMAND_ba_wang_mao的博客-CSDN博客        我们实现CountSpliterReceiveFilter - 固定数量分隔符协议。使用了COMMAND,创建了一个自定义类LOGIN作为KEY,因此客户端发送字符串“#LOGIN#part1#part2#part3#part4#part5#part6#",服务器才能识别,最后用App.Config配置文件启动服务器。

        本篇文章我们仍然实现CountSpliterReceiveFilter - 固定数量分隔符协议,只不过:

(1)、不使用COMMAND。

           不需要创建自定义类作为KEY,因此客户端发送字符串“#part1#part2#part3#part4#part5#part6#part7#",服务器就可以识别。

(2)、不使用App.Config配置文件启动服务器。

        实现CountSpliterReceiveFilter - 固定数量分隔符协议,我们只需要在自定义AppServer类中实现如下代码即可。

using SuperSocket.Common;
using SuperSocket.SocketBase;
using SuperSocket.SocketBase.Protocol;
using SuperSocket.SocketBase.Config;
using SuperSocket.SocketEngine;
using SuperSocket.Facility.Protocol;
 
namespace SuperSocketCountSpliterReceiveFilter
{
    public class CountSpliterReceiveFilterServer:AppServer<CountSpliterReceiveFilterSession>
    {
        /// 请求格式:#part1#part2#part3#part4#part5#part6#part7#
        public CountSpliterReceiveFilterServer()
           : base(new CountSpliterReceiveFilterFactory((byte)'#', 8)) 
//8个分隔符,7个参数。除使用默认的过滤工厂,还可以参照上一个实例定制协议
        {
 
        }

二、创建一个CountSpliterReceiveFilter( 固定数量分隔符协议)工程项目

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

 

三、安装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 代表一个和客户端的逻辑连接,基于连接的操作应该放在该类之中。你可以用该类的实例发送数据到客户端,接收客户端发送的数据或者关闭连接。

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

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

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

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 SuperSocketCountSpliterReceiveFilter
{
    public class CountSpliterReceiveFilterSession : AppSession<CountSpliterReceiveFilterSession>
    {
        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实例获取任何你想要的客户端连接,服务器级别的操作和逻辑应该定义在此类之中。

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

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

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

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;
using SuperSocket.Facility.Protocol;

namespace SuperSocketCountSpliterReceiveFilter
{
    public class CountSpliterReceiveFilterServer:AppServer<CountSpliterReceiveFilterSession>
    {
        /// 请求格式:#part1#part2#part3#part4#part5#part6#part7#
        public CountSpliterReceiveFilterServer()
           : base(new CountSpliterReceiveFilterFactory((byte)'#', 8)) //8个分隔符,7个参数。除使用默认的过滤工厂,还可以参照上一个实例定制协议
        {

        }

        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(CountSpliterReceiveFilterSession 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(CountSpliterReceiveFilterSession session, CloseReason reason)
        {
            base.OnSessionClosed(session, reason);
            Console.Write("\r\n" + session.LocalEndPoint.Address.ToString() + ":断开连接");
        }

    }
}

         我们只需要在自定义AppServer类(CountSpliterReceiveFilterServer)中实现如下代码即可实现CountSpliterReceiveFilter - 固定数量分隔符协议。

using SuperSocket.Common;
using SuperSocket.SocketBase;
using SuperSocket.SocketBase.Protocol;
using SuperSocket.SocketBase.Config;
using SuperSocket.SocketEngine;
using SuperSocket.Facility.Protocol;

namespace SuperSocketCountSpliterReceiveFilter
{
    public class CountSpliterReceiveFilterServer:AppServer<CountSpliterReceiveFilterSession>
    {
        /// 请求格式:#part1#part2#part3#part4#part5#part6#part7#
        public CountSpliterReceiveFilterServer()
           : base(new CountSpliterReceiveFilterFactory((byte)'#', 8)) //8个分隔符,7个参数。除使用默认的过滤工厂,还可以参照上一个实例定制协议
        {

        }

六、program.cs

        本篇文章我们不使用App.Config配置文件启动服务器。

        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 SuperSocketCountSpliterReceiveFilter
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("请按任何键进行启动SuperSocket服务!");
            Console.ReadKey();
            Console.WriteLine();

            var CountSpliterReceiveFilterServer = new CountSpliterReceiveFilterServer();
            // 设置端口号
            int port = 2017;
            //启动应用服务端口
            if (!CountSpliterReceiveFilterServer.Setup(port)) //启动时监听端口2017
            {
                Console.WriteLine("服务端口启动失败!");
                Console.ReadKey();
                return;
            }

            Console.WriteLine();
            //注册连接事件
            CountSpliterReceiveFilterServer.NewSessionConnected += CountSpliterReceiveFilterServer_NewSessionConnected;
            //注册请求事件
            CountSpliterReceiveFilterServer.NewRequestReceived += CountSpliterReceiveFilterServer_NewRequestReceived;
            //注册Session关闭事件
            CountSpliterReceiveFilterServer.SessionClosed += CountSpliterReceiveFilterServer_SessionClosed;
            //尝试启动应用服务
            if (!CountSpliterReceiveFilterServer.Start())
            {
                Console.WriteLine("服务启动失败!");
                Console.ReadKey();
                return;
            }

            Console.WriteLine("服务器状态:" + CountSpliterReceiveFilterServer.State.ToString());

            Console.WriteLine("服务启动成功,请按'q'停止服务!");

            while (Console.ReadKey().KeyChar != 'q')
            {
                Console.WriteLine();
                continue;
            }

            //停止服务
            CountSpliterReceiveFilterServer.Stop();
            Console.WriteLine("服务已停止!");
            Console.ReadKey();
        }

        static void CountSpliterReceiveFilterServer_SessionClosed(CountSpliterReceiveFilterSession session, SuperSocket.SocketBase.CloseReason value)
        {
            Console.WriteLine(session.RemoteEndPoint.ToString() + "连接断开. 断开原因:" + value);
        }

        static void CountSpliterReceiveFilterServer_NewSessionConnected(CountSpliterReceiveFilterSession session)
        {
            Console.WriteLine(session.RemoteEndPoint.ToString() + " 已连接.");
        }

        /// <summary>
        /// 协议并没有什么太多复杂逻辑,不需要用到命令模式,直接用这种方式就可以了
        /// </summary>
        /// <param name="session"></param>
        /// <param name="requestInfo"></param>
        private static void CountSpliterReceiveFilterServer_NewRequestReceived(CountSpliterReceiveFilterSession session, SuperSocket.SocketBase.Protocol.StringRequestInfo requestInfo)
        {
            Console.WriteLine();
            Console.WriteLine("数据来源: " + session.RemoteEndPoint.ToString());
            Console.WriteLine("接收数据内容:" + requestInfo.Body);

        }

    }
}

七、验证

1、启动服务器

        服务器启动成功。

2、启动客户端

3、连接客户端

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

4、客户端发送字符串“#part1#part2#part3#part4#part5#part6#part7#"

       警告:由于使用了CountSpliterReceiveFilter - 固定数量分隔符协议,因此KEY和BODY之间的分隔符为#,参数之间的分隔符也为#,而且字符串结尾不需要添加回车换行符\r\n。

 

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

八、源程序

源程序参见如下链接:

(4条消息) C#SuperSocketCountSpliterReceiveFilter-固定数量分隔符协议)不使用COMMAND-C#文档类资源-CSDN文库

开发工具为:Visual Studio 2017 

源程序中包含SocketTool.exe TCP&UPD测试工具

九、致谢

SuperSocket入门(五)-常用协议实现模版及FixedSizeReceiveFilter示例 - 黄昏前黎明后 - 博客园 (cnblogs.com)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值