目录

C-SuperSocket-手把手教你入门-傻瓜教程-1服务器单向接收客户端发送数据

C# SuperSocket 手把手教你入门 傻瓜教程—1(服务器单向接收客户端发送数据)

C# SuperSocket 手把手教你入门 傻瓜教程系列教程

目录


我是一名单片机嵌入式软件开发工程师,之前从来没有接触过PC端的编程工作,只是这二年由于工程项目有需求,因此匆忙学习C#语言并开发了一款简单的C/S架构的服务器程序,勉强可以满足工程需要,但是毕竟自己非专业人员,编写的程序还有很多漏洞,很多地方还有欠缺,所以空闲时候一直想在网上寻找一种功能强大、稳定可靠的C/S架构的服务器和客户端开源程序来移植到工程项目中,通过网友的介绍知道了 SuperSocket,用它 可以非常便捷的创建一个高可用,高并发的服务系统。 这部教程本人从头到尾介绍如何利用SuperSocket搭建一个属于自己的服务器程序。

一、 SuperSocket 简介

官方网站 :

SuperSocket 是一个轻量级的可扩展的Socket 开发框架,由江振宇先生开发。


1、SuperSocket特点:

  • 简单易用,只需要几个类就能创建出健壮的Socket服务器端程序
  • 性能优良,稳定可靠
  • 支持各种协议, 内置的协议解析工具让你把实现通信协议这种复杂的工作变得很简单
  • 自动支持SSL/TLS传输层加密
  • 强大,灵活而且可扩展的配置让你开发Socket服务器省时省力
  • 支持多个socket服务器实例运行,而且支持多个服务器实例的隔离
  • SuperSocket能以控制台或者Windows服务形式运行,一个脚本就能将SuperSocket安装成服务
  • 灵活的日志策略能够记录大部分socket活动
  • 支持UDP
  • 支持IPv6
  • 支持Windows Azure
  • 支持Linux/Unix操作系统(通过Mono 2.10或以上版本)
  • 内置可直接使用的Flash/Silverlight Socket策略服务器

2、SuperSocket项目特点:

  • 开源,基于Apache 2.0协议,可以免费使用到商业项目。
  • 高性能的事件驱动通信。
  • 会话级别的发送队列能够让你通过会话并发的发送数据,并保持高性能和可控性。
  • 强大且高性能的协议解析实现工具帮你简化了网络数据的分析工作:自带多种数据帧过滤器,可实现自己的数据帧过滤器,可自定义数据内容协议,,粘包拆包都是浮云。
  • 轻量级意味着组件可以自由选择使用,可根据环境变化变更。

3、SuperSocket层次示意图

https://i-blog.csdnimg.cn/blog_migrate/9dae5f977b7a109bc0237eb3a54e501f.png

二、Socket调试工具 SocketTool

链接:

提取码(永久有效):s5wy

https://i-blog.csdnimg.cn/blog_migrate/a0ccd0c00298f545c943850b60c7a662.png

https://i-blog.csdnimg.cn/blog_migrate/baafe4a79e43a0716eb7140dd5ee9604.png

三、移植C# SuperSocket 简介

移植C# SuperSocket需要完成以下几个步骤。

1、使用NuGet下载SuperSocket组件

使用Visual Studio 2017 开发平台【管理NuGet工具包(N)】,在左边的浏览标签中,在输入框输入SuperSocket,搜索SuperSocket,然后下载 SuperSocket 组件和 SuperSocket.Engine 组件。

https://i-blog.csdnimg.cn/blog_migrate/a5a14dbb1a94f1ee7c7c21f88aac0d7c.png

https://i-blog.csdnimg.cn/blog_migrate/d389abf11dcc1ab18e03faf682c3bcbd.png

2、配置log4net.config

Config文件夹下的log4net.config文件的【复制到输出目录】配置为“如果较新则复制”。

https://i-blog.csdnimg.cn/blog_migrate/a9c99a006565d76fea23276001e5621d.png

3、创建AppServer实例

创建Socket服务实例,启动服务器监听客户端。

(1)、使用var appServer = new AppServer(); 创建一个AppServer实例。

(2)、使用 AppServer.Setup(Port)方法:安装和监听端口。

(3)、使用AppServer.Start()方法:启动AppServer实例。

(4)、使用AppServer.Stop()方法:结束AppServer实例。

  • AppServer即为一个Socket监听对象,AppServer实例的Setup为设置监听端口,调用Setup方法时,组件会检测端口是否被占用,如果被占用则会返回False。
  • 调用Setup方法只进行端口占用检测,而不会启动服务,当端口检测校验通过后,需要调用Start方法。
  • 调用Start方法会返回监听是否启动成功,完成以上步骤,则创建了一个简单的SuperSocket实例。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using SuperSocket.Common;
using SuperSocket.SocketBase;
using SuperSocket.SocketBase.Protocol;


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


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

            Console.WriteLine();
          
            if (!appServer.Start())  //Try to start the appServer
            {
                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;
            }
          
            appServer.Stop();
            Console.WriteLine("The Server was stopped!");
            Console.ReadKey();
        }

    }
}

4、创建AppSession实例

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

只有创建了 AppSession实例,我们的服务器才能接收客户端的数据以及给客户端发送数据!!!,需要完成以下工作:

(1)、appServer.NewSessionConnected += appServer_NewSessionConnected;                             注册一个新客户端连接。

(2)、appServer.NewRequestReceived += appServer_NewRequestReceived;                               注册接收客户端报文和发送报文事件

(3)、appServer.SessionClosed += appServer_SessionClosed;

注册客户端关闭连接。

(4)、编写static void appServer_NewSessionConnected(AppSession session)程序代码    (5)、编写static void appServer_NewRequestReceived(AppSession session, SuperSocket.SocketBase.Protocol.StringRequestInfo requestInfo)程序代码

(6)、编写static void appServer_SessionClosed(AppSession session, CloseReason value)程序代码

          //SuperSocket自定义了三个事件 ,连接事件,接收事件,关闭事件
            appServer.NewSessionConnected += appServer_NewSessionConnected;
            appServer.NewRequestReceived += appServer_NewRequestReceived;
            appServer.SessionClosed += appServer_SessionClosed;

            while (Console.ReadKey().KeyChar != 'q')
            {
                Console.WriteLine();
                continue;
            }
          
            appServer.Stop();
            Console.WriteLine("The Server was stopped!");
            Console.ReadKey();
        }


        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("SuperSocket Demo");
                    break;
                case "3":
                    Console.WriteLine(body);
                    break;
            }
        }

        static void appServer_SessionClosed(AppSession session, CloseReason value)
        {
            string ipAddress_Close = session.RemoteEndPoint.ToString();

            Console.WriteLine("已关闭连接!  " + ipAddress_Close);


        }

        static void appServer_NewSessionConnected(AppSession session)
        {
            Console.WriteLine("已连接!  " + session.RemoteEndPoint);
        }

、移植

1、Visual Studio 2017 创建一个控制台应用工程项目

工程项目名称为:SuperSocketTest

https://i-blog.csdnimg.cn/blog_migrate/09bedc1c47571bab5f63dedb13731300.png

https://i-blog.csdnimg.cn/blog_migrate/68e9b13a9dfe4a63c6a63022ef56bd7d.png

2、使用NuGet下载SuperSocket组件

https://i-blog.csdnimg.cn/blog_migrate/486edcb0ff68ec6837fc13a7a29eb619.png

切换到浏览选项卡

https://i-blog.csdnimg.cn/blog_migrate/865effdc4cccf1868eba70334aa1d0c6.png

在浏览选项卡的输入框中输入:SuperSocket,搜索SuperSocket框架组件。先安装SuperSocket组件。

https://i-blog.csdnimg.cn/blog_migrate/ae88ee2c2eb1ba6c903896ad6c00d7f8.png

安装 SuperSocket 组件进行中…

https://i-blog.csdnimg.cn/blog_migrate/79c88c2360476b4c99412cb4a5ae3a90.png

https://i-blog.csdnimg.cn/blog_migrate/9949069296489cec0fffa4327c6d49f9.png

SuperSocket 组件安装完毕…

https://i-blog.csdnimg.cn/blog_migrate/7eed71f0740a33c043f54bd7a9cb9a6f.png

3、 使用NuGet下载SuperSocket.Engine组件

https://i-blog.csdnimg.cn/blog_migrate/6adb4f6c90626d22956b239177ee414e.png

安装SuperSocket.Engine组件完毕。

https://i-blog.csdnimg.cn/blog_migrate/381dbecf4532d493bcb66942d57950b2.png

4、Config文件夹下将 log4net.config文件的【复制到输出目录】配置为“如果较新则复制”。

https://i-blog.csdnimg.cn/blog_migrate/709f964fa709421383cbe78616066d5d.png

下图是:安装完SuperSocket组件和SuperSocket.Engine组件并配置好log4net.config的截屏。

https://i-blog.csdnimg.cn/blog_migrate/6f14a5cbe05f92cae1d3264e733176ee.png

5、在Program.cs中编写【 创建AppServer实例】 程序代码

创建AppServer实例后,可以安装、启动和停止AppServer服务器。

下面是官方提供的代码示例可以用来安装、启动和停止服务器。我直接把官方提供的代码拿来用。但是端口号修改为我需要的端口2021。

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


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

            Console.WriteLine();
          
            if (!appServer.Start())  //Try to start the appServer
            {
                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;
            }
          
            appServer.Stop();
            Console.WriteLine("The Server was stopped!");
            Console.ReadKey();
        }
    }
}

创建AppServer实例】 主要完成以下3项工作:

(1)、使用var appServer = new AppServer(); 创建一个AppServer实例。

var appServer = new AppServer();

(2)、使用appServer.Setup(2021)检测2021端口是否被占用。

如果2021端口被占用,打印输出"Failed to Step!",然后返回。

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

(3)、使用appServer.Start()启动服务器。

如果2021端口没有被占用,则调用appServer.Start()启动服务器。

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

做完以上工作后,只完成了服务器的启动工作,此时还不具备和客户的连接检测及通信功能,因此还需要 创建AppSession 实例。

6、在Program.cs中编写【 创建AppSession实例】 程序代码

创建 AppSession 实例后,才可以处理客户端发送信息。【 创建AppSession实例】 主要完成以下几项工作:

(1)、注册客户端连接方法

appServer.NewSessionConnected += appServer_NewSessionConnected;

(2)、注册客户端断开连接方法

appServer.SessionClosed += appServer_SessionClosed

(3)、注册会话新建事件处理方法

appServer.NewRequestReceived += appServer_NewRequestReceived;

(4)、编写客户端连接方法程序代码

你可以在客户端连接方法中打印输出信息或给客户端发送数据。

static void appServer_NewSessionConnected(AppSession session)

(5)、编写客户端断开连接方法程序代码

你可以在客户端断开连接方法中在控制台窗口打印输出信息或给客户端发送数据。

static void appServer_SessionClosed(AppSession session, CloseReason value)

(6)、编写会话新建事件处理方法程序代码

你可以在会话新建事件处理方法中处理客户端发送的数据,处理完后可以在控制台窗口打印输出信息或给客户端发送数据。

 static void appServer_NewRequestReceived(AppSession session, SuperSocket.SocketBase.Protocol.StringRequestInfo requestInfo)

7、完整的Program.cs程序代码

(1)、在客户端连接方法程序代码static void appServer_NewSessionConnected(AppSession session)中把客户端的IP地址打印输出到控制台窗口,并显示“已连接!”。

(2)、在客户端断开连接方法程序代码static void appServer_SessionClosed(AppSession session, CloseReason value)中把客户端的IP地址打印输出到控制台窗口,并显示“已关闭连接!”。

(3)、在会话新建事件处理方法程序代码static void appServer_NewRequestReceived(AppSession session, SuperSocket.SocketBase.Protocol.StringRequestInfo requestInfo)

中处理客户端发送的数据信息。

当客户端发送数据的key为1时,服务器在控制台窗口打印输出Hello World

当客户端发送数据的key为2时,服务器在控制台窗口打印输出SuperSocket Demo

当客户端发送数据的key为3时,服务器在控制台窗口打印输出客户端发送的数据。

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

using SuperSocket.Common;
using SuperSocket.SocketBase;
using SuperSocket.SocketBase.Protocol;


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


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

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

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

            //SuperSocket自定义了三个事件 ,连接事件,接收事件,关闭事件
            appServer.NewSessionConnected += appServer_NewSessionConnected;
            appServer.NewRequestReceived += appServer_NewRequestReceived;
            appServer.SessionClosed += appServer_SessionClosed;

            while (Console.ReadKey().KeyChar != 'q')
            {
                Console.WriteLine();
                continue;
            }
          
            appServer.Stop();
            Console.WriteLine("The Server was stopped!");
            Console.ReadKey();
        }


        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("SuperSocket Demo");
                    break;
                case "3":
                    Console.WriteLine(body);
                    break;
            }
        }

        static void appServer_SessionClosed(AppSession session, CloseReason value)
        {
            string ipAddress_Close = session.RemoteEndPoint.ToString();

            Console.WriteLine("已关闭连接!  " + ipAddress_Close);


        }

        static void appServer_NewSessionConnected(AppSession session)
        {
            Console.WriteLine("已连接!  " + session.RemoteEndPoint);
        }

    }
}

https://i-blog.csdnimg.cn/blog_migrate/805aa94607fc96c041425c2e08f5308f.png

五、验证

1、运行工程项目

可以观察到SuperSocket服务器启动成功。

https://i-blog.csdnimg.cn/blog_migrate/8989ad563f2bbf3b73920bd53c008672.png

2、运行SocketTool

https://i-blog.csdnimg.cn/blog_migrate/ec91326b95c488aee81c5105c898f821.png

鼠标单击【连接】按钮 https://i-blog.csdnimg.cn/blog_migrate/6a2216d04e2994b0a991580f535ee5d5.png

https://i-blog.csdnimg.cn/blog_migrate/ec486a7ca9ee2c8e981f684f3f279bb8.png

在之前的程序代码中,如果客户端发送“1”,服务器会打印输出"Hello World";如果客户端发送“2”,服务器会打印输出“SuperSocket Demo”;如果客户端发送“3”,服务器会将客户端“3”后面的字符原封不动的打印输出。

3、客户端发送“1”

可以观察到服务器打印输出了"Hello World"。

警告:在客户端输入数字1后,一定要按下回车键才能点【发送数据】按钮,因为SuperSocket规定客户端给服务器发送的报文必须以"\r\n"为结束符,否则服务器会认为是非法报文不预处理。

https://i-blog.csdnimg.cn/blog_migrate/44f3f2c7f71704c3bd11bb2269574e01.png

4、客户端发送“2”

可以观察到服务器打印输出了"SuperSocket Demo"。

警告:在客户端输入数字2后,一定要按下回车键才能点【发送数据】按钮,因为SuperSocket规定客户端给服务器发送的报文必须以"\r\n"为结束符,否则服务器会认为是非法报文不预处理。

https://i-blog.csdnimg.cn/blog_migrate/803a68d38a82b61cea68fd7431a41500.png

5、客户端发送“3 send Body !”

可以观察到服务器打印输出了"send Body !"。

警告:在客户端输入完“3 send Body !”后,一定要按下回车键才能点【发送数据】按钮,因为SuperSocket规定客户端给服务器发送的报文必须以"\r\n"为结束符

,否则服务器会认为是非法报文不预处理。

警告: 3和send之间一定要有一个空格。

https://i-blog.csdnimg.cn/blog_migrate/0e5b16dda824359b955f58bc4f6c3bf2.png

6、SocketTool工具软件上点击【断开】按钮

可以观察到断开连接成功。

https://i-blog.csdnimg.cn/blog_migrate/730218d2df2100461e2a78c5e10886c2.png

7、在控制台窗口中输入q

可以观察到服务器停止。

https://i-blog.csdnimg.cn/blog_migrate/101bcd5d80542a43e13b5eed30329bb7.png

源程序参见如下链接:

源程序中包含SocketTool.exe TCP&UPD测试工具

开发工具为:Visual Studio 2017

致谢: