SuperSocket封装成C#类库的步骤

 更新时间:2021年01月07日 08:56:42   作者:xhubobo  
这篇文章主要介绍了SuperSocket封装成C#类库的步骤,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下

将SuperSocket封装成类库之后可以将其集成进各种类型的应用,而不仅仅局限于控制台应用程序了,从而应用于不同的场景。这里以TelnetServer为例说明如何进行操作。

首先,创建一个C#类库项目LibSocketServer

添加SuperSocket引用(SuperSocket.Common.dll,SuperSocket.SocketBase.dll,SuperSocket.SocketEngine.dll),添加默认的日志框架log4net.dll引用。将log4net.config拷贝到项目文件夹的“Config”文件夹,然后设置它的“生成操作”为“内容”,设置它的“复制到输出目录”为“如果较新则复制”。

其次,添加SuperSocket完整的TelnetServer服务相关类,Socket服务管理类SocketServerManager。

其中SocketServerManager对Bootstrap的设置是SuperSocket封装为类库的关键。

TelnetSession.cs

using System;
using SuperSocket.SocketBase;
using SuperSocket.SocketBase.Protocol;
 
namespace LibSocketServer.Server
{
    public class TelnetSession : AppSession<TelnetSession>
    {
        protected override void OnSessionStarted()
        {
            Console.WriteLine($"New Session Connected: {RemoteEndPoint.Address} " +
                              $"@ {RemoteEndPoint.Port}.");
            Send("Welcome to SuperSocket Telnet Server.");
        }
 
        protected override void HandleUnknownRequest(StringRequestInfo requestInfo)
        {
            Console.WriteLine($"Unknown request {requestInfo.Key}.");
            Send("Unknown request.");
        }
 
        protected override void HandleException(Exception e)
        {
            Console.WriteLine($"Application error: {e.Message}.");
            Send($"Application error: {e.Message}.");
        }
 
        protected override void OnSessionClosed(CloseReason reason)
        {
            Console.WriteLine($"Session {RemoteEndPoint.Address} @ {RemoteEndPoint.Port} " +
                              $"Closed: {reason}.");
            base.OnSessionClosed(reason);
        }
    }
}

TelnetServer.cs

using System;
using SuperSocket.SocketBase;
using SuperSocket.SocketBase.Config;
 
namespace LibSocketServer.Server
{
    public class TelnetServer : AppServer<TelnetSession>
    {
        protected override bool Setup(IRootConfig rootConfig, IServerConfig config)
        {
            Console.WriteLine("TelnetServer Setup");
            return base.Setup(rootConfig, config);
        }
 
        protected override void OnStarted()
        {
            Console.WriteLine("TelnetServer OnStarted");
            base.OnStarted();
        }
 
        protected override void OnStopped()
        {
            Console.WriteLine();
            Console.WriteLine("TelnetServer OnStopped");
            base.OnStopped();
        }
    }
}

AddCommand.cs

using System;
using System.Linq;
using LibSocketServer.Server;
using SuperSocket.SocketBase.Command;
using SuperSocket.SocketBase.Protocol;
 
namespace LibSocketServer.Command
{
    public class AddCommand : CommandBase<TelnetSession, StringRequestInfo>
    {
        public override string Name => "ADD";
        public override void ExecuteCommand(TelnetSession session, StringRequestInfo requestInfo)
        {
            Console.WriteLine($"{Name} command: {requestInfo.Body}.");
            session.Send(requestInfo.Parameters.Select(p => Convert.ToInt32(p)).Sum().ToString());
        }
    }
}

EchoCommand.cs

using System;
using LibSocketServer.Server;
using SuperSocket.SocketBase.Command;
using SuperSocket.SocketBase.Protocol;
 
namespace LibSocketServer.Command
{
    public class EchoCommand : CommandBase<TelnetSession, StringRequestInfo>
    {
        public override string Name => "ECHO";
        public override void ExecuteCommand(TelnetSession session, StringRequestInfo requestInfo)
        {
            Console.WriteLine($"{Name} command: {requestInfo.Body}.");
            session.Send(requestInfo.Body);
        }
    }
}

SocketServerManager.cs

using System;
using System.Reflection;
using SuperSocket.SocketBase;
using SuperSocket.SocketEngine;
 
namespace LibSocketServer
{
    public class SocketServerManager
    {
        private readonly IBootstrap _bootstrap;
 
        public bool Startup(int port)
        {
            if (!_bootstrap.Initialize())
            {
                Console.WriteLine("SuperSocket Failed to initialize!");
                return false;
            }
 
            var ret = _bootstrap.Start();
            Console.WriteLine($"SuperSocket Start result: {ret}.");
 
            return ret == StartResult.Success;
        }
 
        public void Shutdown()
        {
            _bootstrap.Stop();
        }
 
        #region Singleton
 
        private static SocketServerManager _instance;
        private static readonly object LockHelper = new object();
 
        private SocketServerManager()
        {
            var location = Assembly.GetExecutingAssembly().Location;
            var configFile = $"{location}.config";
            _bootstrap = BootstrapFactory.CreateBootstrapFromConfigFile(configFile);
        }
 
        public static SocketServerManager Instance
        {
            get
            {
                if (_instance != null)
                {
                    return _instance;
                }
 
                lock (LockHelper)
                {
                    _instance = _instance ?? new SocketServerManager();
                }
 
                return _instance;
            }
        }
 
        #endregion
    }
}

再次,添加配置文件App.config到类库中,并设置其配置参数。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <section name="superSocket"
                 type="SuperSocket.SocketEngine.Configuration.SocketServiceConfig, SuperSocket.SocketEngine"/>
    </configSections>
 
    <!-- SuperSocket配置的根节点 -->
    <superSocket>
        <!-- 服务器实例 -->
        <servers>
            <server name="TelnetServer" serverTypeName="TelnetServerType" ip="Any" port="2021"></server>
        </servers>
 
        <!-- 服务器类型 -->
        <serverTypes>
            <add name="TelnetServerType" type="LibSocketServer.Server.TelnetServer, LibSocketServer" />
        </serverTypes>
    </superSocket>
</configuration>

最后,创建控制台项目TelnetServerSample,添加项目引用LibSocketServer,然后在Program类中使用SocketServerManager进行SuperSocket的调用。

Program.cs

using System;
using LibSocketServer;
 
namespace TelnetServerSample
{
    class Program
    {
        static void Main()
        {
            try
            {
                //启动SuperSocket
                if (!SocketServerManager.Instance.Startup(2021))
                {
                    Console.WriteLine("Failed to start TelnetServer!");
                    Console.ReadKey();
                    return;
                }
 
                Console.WriteLine("TelnetServer is listening on port 2021.");
                Console.WriteLine();
                Console.WriteLine("Press key 'q' to stop it!");
                Console.WriteLine();
                while (Console.ReadKey().KeyChar.ToString().ToUpper() != "Q")
                {
                    Console.WriteLine();
                }
 
                //关闭SuperSocket
                SocketServerManager.Instance.Shutdown();
            }
            catch (Exception e)
            {
                Console.WriteLine("Exception: {0}", e.Message);
            }
 
            Console.WriteLine();
            Console.WriteLine("TelnetServer was stopped!");
            Console.WriteLine("Press any key to exit...");
            Console.ReadKey();
        }
    }
}

GitHub Sample

以上就是SuperSocket封装成C#类库的步骤的详细内容,更多关于SuperSocket封装成C#类库的资料请关注脚本之家其它相关文章!

相关文章

  • 在C#中使用OpenCV(使用OpenCVSharp)的实现

    在C#中使用OpenCV(使用OpenCVSharp)的实现

    这篇文章主要介绍了在C#中使用OpenCV(使用OpenCVSharp)的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • C#使用Object类实现栈的方法详解

    C#使用Object类实现栈的方法详解

    这篇文章主要介绍了C#使用Object类实现栈的方法,详细分析了栈的原理及使用Object类实现栈的相关技巧与注意事项,需要的朋友可以参考下
    2016-06-06
  • unity自带寻路(导航)系统 Nav Mesh导航网格

    unity自带寻路(导航)系统 Nav Mesh导航网格

    这篇文章主要为大家详细介绍了unity自带寻路(导航)系统,Nav Mesh导航网格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • C#泛型与非泛型性能比较的实例

    C#泛型与非泛型性能比较的实例

    C#泛型与非泛型性能比较的实例,需要的朋友可以参考一下
    2013-04-04
  • C#利用Random得随机数求均值、方差、正态分布的方法

    C#利用Random得随机数求均值、方差、正态分布的方法

    这篇文章主要介绍了C#利用Random得随机数求均值、方差、正态分布的方法,涉及C#数学运算及概率统计的相关技巧,需要的朋友可以参考下
    2015-05-05
  • C#引用类型和值类型的介绍与实例

    C#引用类型和值类型的介绍与实例

    这篇文章主要介绍了C#引用类型和值类型,有需要的朋友可以参考一下
    2013-12-12
  • WCF实现的计算器功能实例

    WCF实现的计算器功能实例

    这篇文章主要介绍了WCF实现的计算器功能,结合具体实例形式较为详细的分析了WCF实现计算器功能的具体步骤与相关操作技巧,需要的朋友可以参考下
    2017-06-06
  • C#/VB.NET 将Word与Excel文档转化为Text

    C#/VB.NET 将Word与Excel文档转化为Text

    这篇文章主要介绍了C#/VB.NET 将Word与Excel文档转化为Text,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-08-08
  • C#实现字符串首字母大写的方法示例

    C#实现字符串首字母大写的方法示例

    这篇文章主要给大家介绍了关于利用C#实现字符串首字母大写的相关资料,这是在最近工作中遇到的一个需求,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-01-01
  • C#多线程等待所有子线程结束的示例

    C#多线程等待所有子线程结束的示例

    这篇文章主要介绍了C#多线程等待所有子线程结束的示例,帮助大家更好的理解和学习c#编程语言,感兴趣的朋友可以了解下
    2020-12-12

最新评论