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日

相关文章

  • .Net Core2.1 WebAPI新增Swagger插件详解

    .Net Core2.1 WebAPI新增Swagger插件详解 Swagger是一种API文档工具,它可以自动生成API文档,并提供一个交互式的UI界面,方便开发人员测试API。在.Net Core2.1中,我们可以使用Swagger插件来自动生成API文档。本攻略将详细介绍如何使用Swagger插件。 安装Swagger插件 我们可以使用以下命令来安装S…

    C# 2023年5月17日
    00
  • C#简易人机对抗“石头剪刀布”游戏的实现

    C#简易人机对抗“石头剪刀布”游戏的实现攻略 1.游戏规则 石头剪刀布游戏是一种双方对抗的游戏,通过手势的比较来得出胜负,具体规则如下: 石头胜剪刀 剪刀胜布 布胜石头 2.实现步骤 2.1.创建表单 首先,我们需要在Visual Studio中新建一个Windows Form Application项目,然后创建一个前端界面,用于显示游戏画面和结果。 2.…

    C# 2023年6月1日
    00
  • C# AutoMapper 使用方法总结

    C# AutoMapper 使用方法总结 什么是AutoMapper AutoMapper 是一个能够自动将对象中属性映射到另一个对象的属性的开源库。 例如,你可能有一个 Domain 对象,这个对象拥有很多属性。而在你的应用程序的某些位置,你需要传递该对象到 MVC 模型或表示图形,而这个位置需要该 Domain 对象中仅一部分属性。AutoMapper …

    C# 2023年6月3日
    00
  • c# WPF如何实现滚动显示的TextBlock

    要实现滚动显示的TextBlock,可以使用WPF中的ScrollViewer和TextBlock结合使用。ScrollViewer是一个滚动视图容器,可以将其在需要滚动的控件周围包装起来,从而实现滚动效果。 下面是实现过程: 第一步:在XAML文件中,在需要滚动显示的TextBlock周围加入ScrollViewer容器,同时设置VerticalScrol…

    C# 2023年6月6日
    00
  • c#静态方法和非静态方法详细介绍

    下面是关于”C#静态方法和非静态方法详细介绍”的完整攻略。 什么是静态方法和非静态方法 C#中的方法可以分为静态方法和非静态方法。 静态方法定义在类中,可以直接通过类名来调用。非静态方法定义在类中,必须通过对象来调用。 以下是一个简单的示例,演示了一个类中包含一个静态方法和一个非静态方法: public class MyClass { public stat…

    C# 2023年6月7日
    00
  • C#运行程序时阻止关闭显示器和系统待机

    为了防止程序在运行时关闭显示器或使系统进入待机状态,我们需要对程序进行一些设置。 方法1:利用Windows API函数 1. 引用Windows API函数 我们可以使用SetThreadExecutionState这个API函数来实现防止系统进入待机状态和关闭显示器,需要在代码中引用kernel32.dll库和SetThreadExecutionStat…

    C# 2023年6月7日
    00
  • C# WINFORM自定义异常处理方法

    下面就为您详细讲解“C# WINFORM自定义异常处理方法”的完整攻略。 什么是异常处理? 首先,我们需要理解什么是异常处理。在编写程序时,有些运行时错误是可以预见的,比如除数为零、数组下标越界、文件不存在等。当这些错误出现时,我们需要给用户一个合理的提示,让用户理解并修复这些问题。这就是异常处理。 在C#中,异常处理通常使用try-catch代码块来完成。…

    C# 2023年6月6日
    00
  • 解决navicat 链接oracle时出现的各种问题

    解决 Navicat 连接 Oracle 时出现的各种问题需要做以下几步: 1. 下载并安装 Oracle Instant Client 访问 Oracle 官网下载 Instant Client,需选择与你所使用操作系统相兼容的版本。下载的压缩包通常包含以下几个文件: instantclient-basiclite-linux.x64-xx.x.x.x.x…

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