C# 常用协议实现模版及FixedSizeReceiveFilter示例(SuperSocket入门)

C# 常用协议实现模版及FixedSizeReceiveFilter示例(SuperSocket入门)

简介

SuperSocket是一款开源的基于.NET平台的高性能Socket服务器框架,支持多种协议(如TCP、UDP、WebSocket等),并提供了基于协议的使用模板,便于快速开发网络应用程序。

本文将介绍使用SuperSocket实现通信协议的方法,以及其中的模板和Fixed Size Receive Filter的示例。

常用协议实现模板

SuperSocket提供了许多常用协议的实现模板,可直接使用并进行相关的配置即可。

以下是常用协议实现模板的示例代码:

基于TCP的Echo协议

using SuperSocket.ProtoBase;
using SuperSocket.SocketBase;
using SuperSocket.SocketBase.Config;
using SuperSocket.SocketEngine;
using System;
using System.Collections.Generic;

namespace SuperSocketEchoServer
{
    public class EchoReceiveFilter : TerminatorReceiveFilter<EchoRequest>
    {
        protected override EchoRequest ProcessMatchedRequest(byte[] buffer, int offset, int length, object context)
        {
            return new EchoRequest { Content = Encoding.ASCII.GetString(buffer, offset, length) };
        }
    }

    public class EchoRequest : IRequest
    {
        public string Content { get; set; }
    }

    public class EchoServer : AppServer<EchoSession, EchoRequest>
    {
        protected override void OnSessionClosed(EchoSession session, CloseReason reason)
        {
            Console.WriteLine("Connection closed: {0}\n", session.RemoteEndPoint.Address);
            base.OnSessionClosed(session, reason);
        }

        protected override void OnNewSessionConnected(EchoSession session)
        {
            Console.WriteLine("New connection established: {0}\n", session.RemoteEndPoint.Address);
            base.OnNewSessionConnected(session);
        }
    }

    public class EchoSession : AppSession<EchoSession, EchoRequest>
    {

    }

    class Program
    {
        static void Main(string[] args)
        {
            var appServer = new EchoServer();
            if(!appServer.Setup(2016))
            {
                Console.WriteLine("Failed to setup!");
                Console.ReadKey();
                return;
            }
            if (!appServer.Start())
            {
                Console.WriteLine("Failed to start!");
                Console.ReadKey();
                return;
            }
            Console.WriteLine("Server started!\n");
            Console.ReadKey();
        }
    }
}

基于WebSocket的Echo协议

using SuperSocket.WebSocket;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SuperWebSocketEchoServer
{
    public class WebSocketEchoServer : WebSocketServer<WebSocketEchoSession>
    {
        protected override void OnSessionClosed(WebSocketEchoSession session, CloseReason reason)
        {
            Console.WriteLine("Connection closed: {0}\n", session.RemoteEndPoint.Address);
            base.OnSessionClosed(session, reason);
        }

        protected override void OnNewSessionConnected(WebSocketEchoSession session)
        {
            Console.WriteLine("New connection established: {0}\n", session.RemoteEndPoint.Address);
            base.OnNewSessionConnected(session);
        }
    }

    public class WebSocketEchoSession : WebSocketSession<WebSocketEchoSession>
    {
        protected override void OnMessageReceived(string message)
        {
            Send(message);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var appServer = new WebSocketEchoServer();
            if (!appServer.Setup(2016))
            {
                Console.WriteLine("Failed to setup!");
                Console.ReadKey();
                return;
            }
            if (!appServer.Start())
            {
                Console.WriteLine("Failed to start!");
                Console.ReadKey();
                return;
            }
            Console.WriteLine("Server started!\n");
            Console.ReadKey();
        }
    }
}

Fixed Size Receive Filter示例

使用Fixed Size Receive Filter,可以对接收到的数据进行指定长度的分组,便于后续的数据处理。

以下是使用Fixed Size Receive Filter的示例代码:

using SuperSocket.ProtoBase;
using SuperSocket.SocketBase;
using SuperSocket.SocketBase.Protocol;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SuperSocketFixedSizeServer
{
    public class FixedSizeRequest : IRequestInfo
    {
        public string Key { get; set; }

        public byte[] Body { get; set; }
    }

    public class FixedSizeReceiveFilter : FixedSizeReceiveFilter<FixedSizeRequest>
    {
        public FixedSizeReceiveFilter() : base(5)
        {

        }

        protected override FixedSizeRequest ProcessMatchedRequest(byte[] buffer)
        {
            return new FixedSizeRequest
            {
                Key = Encoding.ASCII.GetString(buffer, 0, 2),
                Body = buffer.Skip(2).Take(3).ToArray()
            };
        }
    }

    public class FixedSizeServer : AppServer<FixedSizeSession, FixedSizeRequest>
    {
        protected override void OnSessionClosed(FixedSizeSession session, CloseReason reason)
        {
            Console.WriteLine("Connection closed: {0}\n", session.RemoteEndPoint.Address);
            base.OnSessionClosed(session, reason);
        }

        protected override void OnNewSessionConnected(FixedSizeSession session)
        {
            Console.WriteLine("New connection established: {0}\n", session.RemoteEndPoint.Address);
            base.OnNewSessionConnected(session);
        }
    }

    public class FixedSizeSession : AppSession<FixedSizeSession, FixedSizeRequest>
    {

    }

    class Program
    {
        static void Main(string[] args)
        {
            var appServer = new FixedSizeServer();
            appServer.NewSessionConnected += new SessionHandler<FixedSizeSession>(appServer_NewSessionConnected);
            appServer.NewRequestReceived += new RequestHandler<FixedSizeSession, FixedSizeRequest>(appServer_NewRequestReceived);

            if (!appServer.Setup(2016))
            {
                Console.WriteLine("Failed to setup!");
                Console.ReadKey();
                return;
            }
            if (!appServer.Start())
            {
                Console.WriteLine("Failed to start!");
                Console.ReadKey();
                return;
            }
            Console.WriteLine("Server started!\n");
            Console.ReadKey();
        }

        static void appServer_NewSessionConnected(FixedSizeSession session)
        {
            Console.WriteLine("New session connected: {0}\n", session.RemoteEndPoint.Address);
        }

        static void appServer_NewRequestReceived(FixedSizeSession session, FixedSizeRequest requestInfo)
        {
            Console.WriteLine("Request received: {0},{1}\n", requestInfo.Key, Encoding.ASCII.GetString(requestInfo.Body));
            session.Send("Received");
        }
    }
}

在以上示例代码中,指定了数据分组的长度为5,即2个字符为Key,后面3个字符为Body,可根据实际需求修改分组的长度。

总结

本文介绍了使用SuperSocket实现通信协议的方法,以及其中的模板和Fixed Size Receive Filter的示例,由于篇幅所限,只给出了Echo协议和Fixed Size协议的示例代码,实际应用中还可以根据业务需求来选择合适的协议类型,进行相关开发和配置。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C# 常用协议实现模版及FixedSizeReceiveFilter示例(SuperSocket入门) - Python技术站

(0)
上一篇 2023年6月1日
下一篇 2023年6月1日

相关文章

  • c#的dllimport使用方法详解

    关于“C#的DllImport使用方法详解”的攻略如下: 简介 DllImport是C#中一个用于调用非托管代码的方法。它可以让我们在C#代码中调用一些使用一些C++或Win32 API等编写的代码。 使用方法 DllImport的用法非常简单,我们只需要使用指定DllImport特性来声明一个需要调用的函数,然后在代码中直接调用该函数即可。 下面是DllI…

    C# 2023年6月1日
    00
  • C#代码实现扑克牌排序的几种方式

    C#代码实现扑克牌排序的几种方式 1. 排序算法简介 排序算法是计算机程序设计中重要的算法之一,其目的是把一组无序的数据按照一定的顺序排列。排序算法在许多领域中都有广泛的应用,如在数据库中对数据进行排序,对数据结构中的元素进行排序等。 目前常用的排序算法有插入排序、冒泡排序、选择排序、快速排序、归并排序等。其中,插入排序、冒泡排序、选择排序是比较基础和简单的…

    C# 2023年6月7日
    00
  • C# Random.Next()方法: 返回一个随机数

    C#中Random.Next()方法的作用与使用方法 C#中的Random.Next()方法可以生成随机数。它可以根据指定的范围产生一个随机数,可以是整型、浮点型,甚至可以是字符型。该方法不仅可以用于游戏开发,还可以用于模拟实验、密码生成、随机测试等领域。下面将详细介绍该方法的用法和参数。 Random.Next()方法的用法 Random.Next()方法…

    C# 2023年4月19日
    00
  • .NET Core 1.0创建Self-Contained控制台应用

    .NET Core 1.0创建Self-Contained控制台应用 在.NET Core 1.0中,我们可以创建Self-Contained控制台应用程序,这意味着应用程序包含了所有的依赖项和运行时,可以在没有.NET Core运行时的计算机上运行。本文将介绍如何创建Self-Contained控制台应用程序,并提供一些示例来说明如何使用它们。 创建Sel…

    C# 2023年5月17日
    00
  • LINQ基础之Join和UNION子句

    LINQ基础之Join和UNION子句 1. Join子句 Join子句用于将两个数据集合并为一个新的数据集。Join子句需要一个内部键和外部键,用于在两个数据集之间建立关联。 1.1 内部键和外部键 内部键和外部键是Join子句建立关联的基础。内部键是第一个数据集中用于建立关联的字段或属性,而外部键是第二个数据集中用于建立关联的字段或属性。这两个键必须具有…

    C# 2023年6月1日
    00
  • C#中Parallel类For、ForEach和Invoke使用介绍

    C#中Parallel类For、ForEach和Invoke使用介绍 在C#中,Parallel类提供了一些工具来实现并行计算操作。本文将主要介绍Parallel类的三个方法:For、ForEach和Invoke,以及如何使用它们进行并行计算。 Parallel类的使用 使用Parallel类,首先要注意一些事项: 首先,要确保并行操作是有意义的。并不是所有…

    C# 2023年6月6日
    00
  • c# 在windows服务中 使用定时器实例代码

    下面是在Windows服务中使用定时器实现代码的攻略。 攻略 1. 创建Windows服务 首先,我们需要创建一个Windows服务,可以使用Visual Studio创建。具体步骤如下: 打开Visual Studio,选择“新建项目”; 在弹出的新建项目窗口中,选择“Visual C#” -> “Windows” -> “Windows服务”…

    C# 2023年6月1日
    00
  • C#实现系统休眠或静止休眠的方法

    下面是C#实现系统休眠或静止休眠的方法的完整攻略。 1. 系统休眠 1.1 方法介绍 我们可以通过Windows API去实现系统休眠,具体的API是SetSuspendState。该方法有两个参数,参数一表示是否进入睡眠(0表示待机,1表示睡眠),参数二表示是否启用快速恢复。 1.2 代码示例 下面是一个简单的实现系统休眠的代码示例: using Syst…

    C# 2023年6月7日
    00
合作推广
合作推广
分享本页
返回顶部