关闭

SuperSocket入门系列-02

标签: .netsupersocket
1557人阅读 评论(2) 收藏 举报
分类:

首先给大家拜个年,祝大家新年快乐,万事如意,阖家欢乐。当然最重要的是祝大家在新的一年工资节节高,技术时时强。

先要给大家表达一个歉意,就是关于断更这么长时间的问题,一方面是因为当时写完第一篇文章之后不久就从原公司离职了,然后新公司里面没有从事这块的工作,故就停更了,后面挺多的朋友也加入了讨论群询问关于断更的事宜我个人也挺不好意思了,所以在拖了这么久之后我就要补上第二篇了,也不说太多解释的话了,就直接上教程了,这节教程主要是讲解关于自定义session和自定义command内容,有兴趣的童鞋可以开始游览了。

上一篇文章里面我们首先学习了如何使用supersokcet自带的原生组件去实现一个简单的socket通信例子,这里就进行进阶学习。

1、我们先建立一个SuperSocketTest2的项目然后使用NuGet工具搜索SuperSocket安装即可(安装SuperSocket,SuperSocket.Engine两个组件),在某些地区可能NuGet使用受到影响无法使用的话可以去第一篇的文章里面找一下下载链接进行添加引用即可。

注:养成一个使用NuGet管理器安装组件的习惯,以后卸载或更新会很方便,文档方面也便于寻找。


2、安装完毕后,项目结构应如下所示:


Config:日志配置文件,用于记录SuperSocket运行中各个状态信息及错误信息

supersocket.cmd:SuperSocket提供的一个托管组件,用于托管已开发的应用,在后面将讲述如何把自己开发的应用托管到SuperSocket提供的运行组件中。

3、因为要使用自定义Session及Command方式,所以我们新建两个Class文件,分别命名为TestSession及TestCommand


using SuperSocket.SocketBase;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SuperSocket.SocketBase.Protocol;

namespace SuperSocketTestProject2.Custom
{
    public class TestSession : AppSession<TestSession>
    {
        public int CustomID { get; set; }
        public string CustomName { get; set; }
        protected override void OnSessionStarted()
        {
            Console.WriteLine("新的用户请求");
            base.OnSessionStarted();
        }

        protected override void HandleUnknownRequest(StringRequestInfo requestInfo)
        {
            base.HandleUnknownRequest(requestInfo);
        }

        protected override void OnSessionClosed(CloseReason reason)
        {
            base.OnSessionClosed(reason);
        }
    }
}


:创建自定义Session类需要实现AppSession抽象方法,实现AppSession类后可以重写我们常见的事件类型

a、OnSessionStarted 用户连接会话

b、HandleUnknownRequest 未知的用户请求命令

c、OnSessionClosed 会话关闭

在TestSession中我自定义了两个字段,分别为CustomID与CustomName,在实际使用过程中如果需要针对Session添加关于应用的运行数据,也可以通过这种方式实现,不仅限制于字段类型,对象类型也是支持的。

using SuperSocket.SocketBase.Command;
using SuperSocket.SocketBase.Protocol;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SuperSocketTestProject2.Custom
{
    public class TestCommand : CommandBase<TestSession, StringRequestInfo>
    {
        public override void ExecuteCommand(TestSession session, StringRequestInfo requestInfo)
        {
            session.CustomID = new Random().Next(10000, 99999);
            session.CustomName = "hello word";
            Console.WriteLine(session.CustomID);
            Console.WriteLine(session.CustomName);

            var key = requestInfo.Key;
            var param = requestInfo.Parameters;
            var body = requestInfo.Body;
            Console.WriteLine(key);
            Console.WriteLine(param);
            Console.WriteLine(body);

            session.Send(session.CustomID.ToString());
        }
    }
}


:创建自定义Command类需要实现CommandBase抽象方法,实现CommandBase类后可以重写我们核心的命令处理类

a、在代码的一开始,我就使用了在TestSession类中自定义的两个字段,分别对这两个字段进行了赋值然后进行输出,这里在实际应用中我们可以根据字段的具体定义进行赋值操作。

b、我们可以看到在Command类中实现的方法ExecuteCommand中包含两个参数,一个为Session,一个为StringRequestInfo。两个参数分别对应的定义为:前者表示当前发起命令的会话,后者表示发起命令的具体内容,我们使用这两个方法就可以完全对客户端传递的命令进行处理,逻辑导航如下:

发起命令 > SuperSocket处理解析 > 触发Session内部事件 > 触发ExecuteCommand事件 > 自定义命令解析处理 > 触发Send事件返回服务器处理数据

c、在requestInfo对象中key表示命令头,param表示命令参数,body表示请求内容(注:在默认协议中,key、param、body的区分都是依靠空格实现,列如add 1 1,解析的意思就是key=add、param=[1,1]、body=1 1),依靠内置的默认换行符协议就可以实现大部分想要的功能内容,也是在简单应用上面推荐的一种通信协议。

我们创建完两个自定义的核心类后就需要开始去使用,这时候我们就不能使用原始的AppServer服务进行启动,而是要在此基础上面封装属于自己的AppServer类型。


using SuperSocket.SocketBase;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SuperSocketTestProject2.Custom
{
    public class TestServer : AppServer<TestSession>
    {
    }
}

如图所示,我们创建一个TestServer类然后实现AppServer服务类并将我们自定义的Session类传递进去,如果不需要额外重写AppServer内的方法那就可以不需要添加其他的重写方法,完成以上的三个Class类后,我们就可以使用之前启动服务的方式对我们的自定义服务类进行启动,如下图:


如果能看到我们启动服务成功的提示,那么第一步的配置就算OK了。下面我们就来讲解客户端如何发起命令请求:


客户端发起请求:TestCommand 1 1 /r/n(换行符)

服务端收到请求:key=TestCommand 、param=[1,1]、body=1 1,param使用string数组存储,body则存储除TestCommand命令头后的所有内容

如上说明,如果想自定义其他命令类型,则可以创建新的Command类,列如CreateCommand等,则在客户端发起请求时命令请求格式为:CreateCommand 1 1,默认格式必须采用空格分隔,和cmd命令行协议一致。

收到请求后,我们就可以根据具体业务进行处理然后session.Send返回处理内容。


后记:使用日志组件需要先初始化配置文件,然后在应用目录的Logs文件夹内即可查询所有日志内容。

还是打个广告了,技术讨论群:153373508

1
1

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:11941次
    • 积分:219
    • 等级:
    • 排名:千里之外
    • 原创:9篇
    • 转载:0篇
    • 译文:0篇
    • 评论:4条
    文章分类
    最新评论