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

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

C# SuperSocket 手把手教你入门 傻瓜教程---2(服务器和客户端双向通信)

C# SuperSocket 手把手教你入门 傻瓜教程---3(Telnet服务器和客户端请求处理)

C# SuperSocket 手把手教你入门 傻瓜教程---4(创建一个服务器和多客户端双向通信程序)

C# SuperSocket 手把手教你入门 傻瓜教程---5(探索自定义AppServer、AppSession,Conmmand,用配置文件App.comfig启动服务器)

C# SuperSocket 手把手教你入门 傻瓜教程---6(CommandLineProtocol---命令行协议)

C# SuperSocket 手把手教你入门 傻瓜教程---7(自定义CommandLineProtocol---命令行协议)

C# SuperSocket 手把手教你入门 傻瓜教程-8(TerminatorReceiveFilter - 结束符协议)

目录

一、SuperSocket 简介

二、Socket调试工具 SocketTool

三、移植C# SuperSocket 简介

四、移植

五、验证

致谢:


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

二、Socket调试工具 SocketTool

链接:百度网盘 请输入提取码
        提取码(永久有效):s5wy

三、移植C# SuperSocket 简介

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

1、使用NuGet下载SuperSocket组件

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

2、配置log4net.config

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

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的初始化工作后,我们就需要对组件的相关事件进行封装,如客户端连接,断开,接受数据事件,这时候我们就可以通过appSession进行创建。

只有创建了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

2、使用NuGet下载SuperSocket组件  

切换到浏览选项卡

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

安装 SuperSocket 组件进行中...

SuperSocket 组件安装完毕...

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

安装SuperSocket.Engine组件完毕。

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

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

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);}}
}

五、验证

1、运行工程项目

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

2、运行SocketTool

鼠标单击【连接】按钮

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

3、客户端发送“1”

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

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

4、客户端发送“2”

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

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

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

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

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

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

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

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

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

可以观察到服务器停止。

源程序参见如下链接:

C#SuperSocket手把手教你入门傻瓜教程.zip_supersocket教程-互联网文档类资源-CSDN下载

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

开发工具为:Visual Studio 2017

致谢:

SuperSocket入门系列-01_Laymat's blog-CSDN博客_supersocket

SuperSocket 1.6.4 通过FixedHeaderReceiveFilter解析自定义协议 - xiepeixing - 博客园 (cnblogs.com)

SuperSocket入门(一)-Telnet服务器和客户端请求处理

SuperSocket基础(二)-----一个完整的SocketServer项目

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

  1. C# SuperSocket 手把手教你入门 傻瓜教程---5(探索自定义AppServer、AppSession,Conmmand,用配置文件App.comfig启动服务器)

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

  2. C# SuperSocket 手把手教你入门 傻瓜教程---3(Telnet服务器和客户端请求处理)

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

  3. 手把手教你入门 Git 教程,图文实例详解

    前言 Git简介 实用主义 深入探索 总结 参考资料 Git简介 Git 是一种分布式版本控制系统,它可以不受网络连接的限制,加上其它众多优点,目前已经成为程序开发人员做项目版本管理时的首选,非开发人 ...

  4. 云服务器架设网站教程_手把手教你搭建腾讯云服务器入门(图文教程)

    本文由博主 威威喵 原创 博客主页:https://blog.csdn.net/smile_running 背景 暑假期间,愁着无聊但也不能荒废学业吧,毕竟以后想靠技术混口饭吃!为了实施自己的计划,特 ...

  5. 手把手教你入门Git --- Git使用指南(Linux)

    手把手教你入门Git - Git使用指南(Linux) 系统:ubuntu 18.04 LTS 本文所有git命令操作实验具有连续性,git小白完全可以从头到尾跟着本文所有给出的命令走一遍,就会对gi ...

  6. python新手入门代码-新手必看:手把手教你入门 Python

    原标题:新手必看:手把手教你入门 Python 本文为 AI 研习社编译的技术博客,原标题 : Learning Python: From Zero to Hero 翻译 |永恒如新的日常校对 | 酱 ...

  7. 拆装计算机主机,零基础如何组装电脑?装机之家手把手教您电脑组装教程图解...

    自己组装电脑对于小白来说,确实是一个技术活,如果没有一点点电脑组装经验,肯定无从下手的.当然对于目前互联网信息化时代,想要找一篇装机教程并不难,那么我们跟着装机教程一步一步学习并实践,相信很快就可以将 ...

  8. 手把手教你入门Python爬虫(二)

    手把手教你入门Python爬虫 前言   在上一篇文章中,我们讲解到了基础的计算机网络知识,并完成了"爬取豆瓣Top250电影信息"的项目.那么这一次,作者将带领大家完成" ...

  9. 手把手教你搭建腾讯云服务器

    手把手教你搭建腾讯云服务器(图文并茂) 威威貓 2019-03-28 08:10:28  58357  收藏 162 分类专栏: 杂七杂八 文章标签: 服务器搭建 腾讯云服务器 云服务器环境配置 新手 ...

最新文章

  1. 探测参考信号(Sounding Reference Signal)
  2. hbase.client.keyvalue.maxsize的默认值
  3. 37个我爱Ruby的理由
  4. skyline point解析
  5. 【图像处理】Qt+OpenCV自制mini软件——图像二值化器
  6. python 直方图每个bin中的值_使用python中的matplotlib进行绘图分析数据
  7. linux salt命令 -e,Linux记录-salt命令
  8. 浅谈前后端路由与前后端渲染
  9. Unity UI框架思路与实现
  10. 修饰器 TypeError: A() missing 1 required positional argument: ‘func‘
  11. 从零到一,美芽的技术实战
  12. 网页元素3D效果展示
  13. response.getStatusCode()==200什么意思
  14. 启动虚拟机sd 0:0:0:0: [sda] Assuming drive cache: write through错误解决 本人实测!
  15. python时间函数纳秒_python – 获取纳秒级精度的文件修改时间
  16. 如何生成Android的keystore文件
  17. Trinity的介绍与下载
  18. 继电器模块的的使用方法、引脚说明、内部结构、接线说明(超通俗超详细看了就能给别人讲)
  19. 什么是DNA微阵列技术?
  20. 如何查看centos系统cpu/内存使用情况

热门文章

  1. 电子科技大学计算机与科学学院,电子科技大学计算机科学与工程学院(网络空间安全学院)、资源与环境学院赴我所调研考察...
  2. SocketTools 11在所有HTTP客户端组件支持
  3. Android 地理位置定位
  4. h7的HAL 1.8.0版本库的RTC时钟没起振 死循环 无法退出
  5. 系统设计文档结构体例理解与决策
  6. 系统架构设计师视频教程(2016)
  7. 你不必使用弱引用以避免内存泄漏
  8. 浙江省c语言二级的笔试真题及答案,浙江省高等学校C语言二级----笔试部分真题2007-2010年.doc...
  9. 将表格数据转为JSON
  10. 使用DevExpress Reports和PDF Viewer创建AcroForm Designer