栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

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

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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.先简单定义一个数据包类,大家可以根据实际需求修改字段

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

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

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

        public object Context { get; set; }

        public IPipelineFilter NextFilter => this;

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

        public void Reset() { }

    }

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

    /// 
    /// 服务帮助类
    /// 
    public class ServerHelper
    {
        /// 
        /// 使用自定义的数据包和过滤器创建的服务宿主
        /// 
        private readonly ISuperSocketHostBuilder host = SuperSocketHostBuilder.Create();
        /// 
        /// 会话集合
        /// 
        private readonly ConcurrentDictionary SessionsDict = new ConcurrentDictionary();
        /// 
        /// 启动Socket服务(只须调用此方法即可启动)
        /// 
        /// 
        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;
        }
        /// 
        /// 停止服务
        /// 
        /// 
        public bool StopServer()
        {
            bool isSuccess = false;
            foreach (var v in SessionsDict)
            {
                v.Value.CloseAsync(CloseReason.ServerShutdown);
            }
            SessionsDict.Clear();
            return isSuccess;
        }
        /// 
        /// 会话的连接事件
        /// 
        /// 
        /// 
        private async ValueTask OnConnectedAsync(IAppSession session)
        {
            await Task.Run(() =>
             {
                 while (!SessionsDict.ContainsKey(session.SessionID))
                 {
                     //添加不成功则重复添加
                     if (!SessionsDict.TryAdd(session.SessionID, session))
                         Thread.Sleep(1);
                 }
             });
        }
        /// 
        /// 会话的断开事件
        /// 
        /// 
        /// 
        /// 
        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);
                 }
             });
        }
        /// 
        /// 数据接收事件
        /// 
        /// 
        /// 
        /// 
        private async ValueTask OnPackageAsync(IAppSession session, DataPackage package)
        {
            await Task.Run(() =>
             {
                 //发送收到的数据
                 session.SendAsync(package.Datas);
             });
        }

    }

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

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

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/906165.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号