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#并行编程示例分享

    下面是“C#并行编程示例分享”的完整攻略。 1. 什么是并行编程 并行编程是指在多个处理单元上同时执行多个或者相同的任务。在单核情况下,多个任务在同一时间只有一个能够被执行,但是在多核情况下,多个任务可以被分配到各个核心上同时执行。并行编程能够提高程序的性能和响应能力。 2. C#的并行编程 C# 中的并行编程主要是通过 Task Parallel Libr…

    C# 2023年6月1日
    00
  • 简述C#枚举高级战术

    下面是详细讲解“简述C#枚举高级战术”的完整攻略。 什么是枚举 枚举是一种特殊的数据类型,它表示一组有限的值,这组值被称为枚举成员。在C#中,我们使用enum关键字来定义枚举类型。下面是定义一个枚举类型的示例: enum Color { Red, Green, Blue } 这里我们定义了一个名为Color的枚举类型,它包含了三个枚举成员:Red、Green…

    C# 2023年5月14日
    00
  • C#实现屏幕拷贝的方法

    若想在C#应用程序中实现屏幕拷贝功能,需要涉及到以下几个步骤: 1. 引用相关命名空间 使用屏幕拷贝功能需要使用System.Drawing和System.Windows.Forms命名空间中的类,需要确保它们被引用。 using System.Drawing; using System.Drawing.Imaging; using System.Windo…

    C# 2023年6月6日
    00
  • C#实现数字转换汉字的示例详解

    C#实现数字转换汉字的示例详解 本篇文章将会详细介绍如何使用C#实现数字转换为汉字的功能。在实现过程中,我们将会涉及到几个关键的步骤,包括将数字切割为若干个位数、将每一个位数转换为汉字、考虑进位等功能实现。 步骤一:将数字切割为若干个位数 在C#中,可以使用数字的%运算符和/运算符将数字切割为个位数和剩余数字。代码示例如下: int num = 12345;…

    C# 2023年6月7日
    00
  • ASP.NET如何定时调用WebService服务

    ASP.NET 定时调用 WebService 有多种实现方式,其中比较常用的有使用定时器 Timer 和使用 Quartz.NET 两种。下面分别给出两种方式的示例说明。 使用定时器 Timer 实现定时调用 WebService 使用 System.Windows.Forms.Timer 实现,在 WebForm 或 Windows 窗口应用程序中可以轻…

    C# 2023年6月3日
    00
  • C#事件标准命名规则及说明(包括用作事件类型的委托命名)

    下面是关于“C#事件标准命名规则及说明(包括用作事件类型的委托命名)”的完整攻略。 1. 事件标准命名规则 1.1 委托命名 在C#中,常用委托命名作为事件的类型,因此委托的命名很关键。根据Microsoft官方文档的建议,委托命名应该基于事件的名称以及命名以EventHandler结尾。例如,声明一个叫做“ButtonClick”的事件,应该使用以下的委托…

    C# 2023年5月15日
    00
  • C#执行Javascript代码的几种方法总结

    C#执行JavaScript代码的几种方法总结 在C#代码中执行JavaScript代码是非常有用的操作,本文将介绍C#执行JavaScript代码的几种方法,以及各种方法的优缺点和应用场景。 方法一:WebBrowser控件 WebBrowser控件是一个基于IE内核的控件,可以解析和渲染HTML文档,同时支持JavaScript代码的执行。可以通过在C#…

    C# 2023年5月15日
    00
  • asp.net 在客户端显示服务器端任务处理进度条的探讨

    一、技术原理简介 在 ASP.NET 中,我们可以使用 AJAX 技术来实现异步通信,从而达到在不刷新整个页面的情况下更新页面内容的目的。其中,可以使用 UpdatePanel 控件实现部分更新,也可以使用 jQuery 或者原生 JavaScript 的 AJAX 方法手动处理异步请求和响应。 而在处理较为耗时的服务器端任务时,我们可以使用异步处理方法,如…

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