SuperSocket教程C#/.Net core/.Net 5开发使用SuperSocket2.0启动Socket服务附带代码实例net core supersocket

SuperSocket教程C#/.Net core/.Net 5使用SuperSocket2.0开发Socket服务附带代码实例 net core supersocket

最近看到SuperSocket2.0已经发布了多个预览版了,于是用.Net core 5学习了一下SuperSocket2.0的使用方法,并且编写了一个例子,本例程用到了自定义数据包和自定义过滤器实现将收到的客户端数据返回给客户端,在此分享出来与大家交流学习一下。

首先使用Nuget下载包SuperSocket到你的项目中,注意要勾选预览版,版本选择2.0

1.先简单定义一个数据包类,大家可以根据实际需求修改字段

    /// <summary>
    /// 自定义数据包
    /// </summary>
    public class DataPackage
    {
        /// <summary>
        /// 功能码
        /// </summary>
        public int FCode { get; set; } = -1;
        /// <summary>
        /// 数据
        /// </summary>
        public byte[] Datas { get; set; }
    }

2.再简单定义一个过滤器,这里是将原始数据转化成数据包类型,这里仅仅是将原始数据取出来,大家可以在Filter方法中根据实际需求修改

    /// <summary>
    /// 自定义数据过滤器
    /// </summary>
    public class DataFilter : IPipelineFilter<DataPackage>
    {
        public IPackageDecoder<DataPackage> Decoder { get; set; }

        public object Context { get; set; }

        public IPipelineFilter<DataPackage> NextFilter => this;

        public DataPackage Filter(ref SequenceReader<byte> reader)
        {
            DataPackage txtPackage = new DataPackage { Datas = reader.Sequence.ToArray() };
            while (reader.TryRead(out _)) ;
            return txtPackage;
        }

        public void Reset() { }

    }

3.再定义我们的服务帮助类使用上面的数据包和过滤器启动服务,只要调用里面的RunServer方法就可以启动服务了

    /// <summary>
    /// 服务帮助类
    /// </summary>
    public class ServerHelper
    {
        /// <summary>
        /// 使用自定义的数据包和过滤器创建的服务宿主
        /// </summary>
        private readonly ISuperSocketHostBuilder<DataPackage> host = SuperSocketHostBuilder.Create<DataPackage, DataFilter>();
        /// <summary>
        /// 会话集合
        /// </summary>
        private readonly ConcurrentDictionary<string, IAppSession> SessionsDict = new ConcurrentDictionary<string, IAppSession>();
        /// <summary>
        /// 启动Socket服务(只须调用此方法即可启动)
        /// </summary>
        /// <returns></returns>
        public bool RunServer()
        {
            bool isSuccess = true;
            //配置参数
            host.ConfigureSuperSocket(options =>
            {
                options.Name = "PxIotServer";
                options.MaxPackageLength = 1024 * 1024;
                options.ReceiveBufferSize = 4 * 1024;
                options.SendBufferSize = 4 * 1024;
                options.ReceiveTimeout = 0;
                options.SendTimeout = 500 * 1000;
                options.Listeners = new[] { new ListenOptions { Ip = "Any", Port = 7010, BackLog = 1024 } }.ToList();
            });
            //使用会话的连接和断开事件
            host.UseSessionHandler(OnConnectedAsync, OnClosedAsync);
            //使用会话的数据接收时间
            host.UsePackageHandler(OnPackageAsync);
            //启动
            host.RunConsoleAsync();
            return isSuccess;
        }
        /// <summary>
        /// 停止服务
        /// </summary>
        /// <returns></returns>
        public bool StopServer()
        {
            bool isSuccess = false;
            foreach (var v in SessionsDict)
            {
                v.Value.CloseAsync(CloseReason.ServerShutdown);
            }
            SessionsDict.Clear();
            return isSuccess;
        }
        /// <summary>
        /// 会话的连接事件
        /// </summary>
        /// <param name="session"></param>
        /// <returns></returns>
        private async ValueTask OnConnectedAsync(IAppSession session)
        {
            await Task.Run(() =>
             {
                 while (!SessionsDict.ContainsKey(session.SessionID))
                 {
                     //添加不成功则重复添加
                     if (!SessionsDict.TryAdd(session.SessionID, session))
                         Thread.Sleep(1);
                 }
             });
        }
        /// <summary>
        /// 会话的断开事件
        /// </summary>
        /// <param name="session"></param>
        /// <param name="e"></param>
        /// <returns></returns>
        private async ValueTask OnClosedAsync(IAppSession session, CloseEventArgs e)
        {
            await Task.Run(() =>
             {
                 while (SessionsDict.ContainsKey(session.SessionID))
                 {
                     //移除不成功则重复移除
                     if (!SessionsDict.TryRemove(session.SessionID, out _))
                         Thread.Sleep(1);
                 }
             });
        }
        /// <summary>
        /// 数据接收事件
        /// </summary>
        /// <param name="session"></param>
        /// <param name="package"></param>
        /// <returns></returns>
        private async ValueTask OnPackageAsync(IAppSession session, DataPackage package)
        {
            await Task.Run(() =>
             {
                 //发送收到的数据
                 session.SendAsync(package.Datas);
             });
        }

    }

4.最后再调用ServerHelper中的启动函数就可以了

            ServerHelper socketApi = new ServerHelper();
            socketApi.RunServer();

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
SuperSocket 是一个轻量级, 跨平台而且可扩展的 .Net/Mono Socket 服务器程序框架。你无须了解如何使用 Socket, 如何维护 Socket 连接和 Socket 如何工作,但是你却可以使用 SuperSocket 很容易的开发出一款 Socket 服务器端软件,例如游戏服务器,GPS 服务器, 工业控制服务和数据采集服务器等等。 SuperSocket具有如下特点: 高性能的事件驱动通信; 非常简单易用; 你只需要通过创建几个类就能获得一个健壮的 Socket 服务器; 内置的命令行协议让你能够迅速创建一个网络命令行接口服务器; 强大且高性能的协议解析实现工具帮你简化了网络数据的分析工作; 灵活的配置功能和友好的配置 API; 多监听器支持; 让你在一个服务实例内监听多个端口; 多服务实例托管的支持让你从容面对复杂的部署需求; 应用程序域和进程级别的隔离能够满足你大部分的宿主场景; 内置的 SSL/TLS 加密支持; 会话级别的发送队列能够让你通过会话并发的发送数据,并保持高性能和可控性; SuperSocket 的命令处理模式让你的业务逻辑更清晰,更有条理; 优良的可扩展 API 支持: Command Filter, Connection Filter, Command Loader; 可替换的日志架构允许你使用你喜欢的日志组件; 动态语言的支持; 允许你用 Python 之类的脚本语言来实现命令; 与 Mono/Linux 保持二进制级别的兼容; Windows Azure 的支持; 内置你可以直接用于 Flash 或 Silverlight 客户端的 Socket 策略服务器;

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值