SuperSocket入门系列-01

  • Post author:
  • Post category:其他






说到socket,我们常见的处理方法是使用Socket组件自己去定义监听和处理,如果是在代码量较小的情况下面,使用这种方式可能会得心应手,但是如果遇到大的项目就显得有点力不从心了。这里博主则推荐一款.Net环境下的Socket框架,可以非常便捷的创建一个高可用,高并发的服务系统。





官方网站

SuperSocket





首先需要下载项目组件:

SuperSocket dll

,因为官网的链接较慢,故放到了百度云盘,如果需要最新版,则可自行去官网下载。





Socket调试工具:

SocketTools





我们下载完毕之后,找到需要引用的组件:log4net.dll,Newtonsoft.Json.dll,SuperSocket.Common,SuperSocket.SocketBase,SuperSocket.SocketEngine添加至项目。







打开Program编写如下代码:

        static void Main(string[] args)
        {
            var appServer = new AppServer();

            //Setup the appServer
            if (!appServer.Setup(2012)) //Setup with listening port
            {
                Console.WriteLine("Failed to setup!");
                Console.ReadKey();
                return;
            }

            Console.WriteLine();

            //Try to start the appServer
            if (!appServer.Start())
            {
                Console.WriteLine("Failed to start!");
                Console.ReadKey();
                return;
            }

            Console.WriteLine("The server started successfully, press key 'q' to stop it!");

            while (Console.ReadKey().KeyChar != 'q')
            {
                Console.WriteLine();
                continue;
            }

            //Stop the appServer
            appServer.Stop();

            Console.WriteLine("The server was stopped!");
            Console.ReadKey();
        }



1、AppServer即为一个Socket监听对象,AppServer实例的Setup为设置监听端口,调用Setup方法时,组件会检测端口是否被占用,如果被占用则会返回False。





2、调用Setup方法只进行端口占用检测,而不会启动服务,当端口检测校验通过后,需要调用Start方法,Start方法会返回监听是否启动成功。





3、完成以上步骤,则创建了一个简单的SuperSocket实例。





当我们完成了一系列的初始化工作后,我们就需要对组件的相关事件进行封装,如客户端连接,断开,接受数据事件,这时候我们就可以通过appServer进行创建:

            appServer.NewSessionConnected += appServer_NewSessionConnected;
            appServer.SessionClosed += appServer_SessionClosed;
            appServer.NewRequestReceived += appServer_NewRequestReceived;
        static void appServer_NewRequestReceived(AppSession session, SuperSocket.SocketBase.Protocol.StringRequestInfo requestInfo)
        {
            throw new NotImplementedException();
        }


        static void appServer_SessionClosed(AppSession session, CloseReason value)
        {
            throw new NotImplementedException();
        }


        static void appServer_NewSessionConnected(AppSession session)
        {
            throw new NotImplementedException();
        }




NewSessionConnected

客户端连接




SessionClosed

客户端关闭




NewRequestReceived

客户端发送的数据





在SuperSocket中,监听服务即为AppServer,一个客户端连接为Session,AppServer和Session都可以自己高度定义和创建,将会在后面环节讲解。





首先,我们在

NewSessionConnected

中输出一个操作:


        static void appServer_NewSessionConnected(AppSession session)
        {
            Console.WriteLine("Session:" + session.RemoteEndPoint + " connect");
        }









我们就可以看到在客户端连接后这个事件即被触发,反之关闭事件的提示也是如此。







因为Socket数据传输是一整条流数据,不同于Web类可以指定头部,字段然后后台对应读取,所以需要使用一套命令行协议来进行数据交换工作。SuperSocket默认使用的是



Cmd的命令行模式,列如 ADD A A \r\n,ADD即为命令头,A A为命令参数,\r\n截止符(表示这段数据的截止位),那我们就可以用这套协议上手一个简单的示例。




        static void appServer_NewRequestReceived(AppSession session, SuperSocket.SocketBase.Protocol.StringRequestInfo requestInfo)
        {
            var key = requestInfo.Key;
            var body = requestInfo.Body;
            switch(key)
            {
                case "1":
                    Console.WriteLine("hello word");
                    break;
                case "2":
                    Console.WriteLine("LOL");
                    break;
                case "3":
                    Console.WriteLine(body);
                    break;
            }
        }






默认协议需要换行符,没有换行符则无法处理!




某些情况下面,我们接收到数据处理后需要返回给客户端,则需要使用Session的Send方法进行数据发送,示例:


        static void appServer_NewRequestReceived(AppSession session, SuperSocket.SocketBase.Protocol.StringRequestInfo requestInfo)
        {
            var key = requestInfo.Key;
            var body = requestInfo.Body;
            switch(key)
            {
                case "1":
                    Console.WriteLine("hello word");
                    break;
                case "2":
                    Console.WriteLine("LOL");
                    break;
                case "3":
                    Console.WriteLine(body);
                    session.Send(body);
                    break;
            }
        }



当key为3时,返回客户端发送的数据。





第一期教程就到这里结束,有问题可以加群153373508探讨。



版权声明:本文为laymat原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。