1(服务器单向接收客户端发送数据)
目录
我是一名单片机嵌入式软件开发工程师,之前从来没有接触过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
可以观察到服务器停止。
2(服务器和客户端双向通信)
目录
仅仅实现客户端将报文发送给服务器,服务器收到客户端的数据后打印输出到控制台窗口,还没有实现服务器如何给客户端发送数据。
下面就简要介绍服务器如何给客户端发送数据。
服务器给客户端发送数据,只需要使用Session的Send方法即可实现。
一、安装SuperSocket组件
安装SuperSocket组件请参见上一篇文章。
二、服务器检测到新连接时给客户端发送数据
服务器检测到客户端创建了一个新连接时,仅仅在控制台窗口打印输出““已连接!”+客户端IP地址。
现在我们改造一下,当服务器检测到客户端创建了一个新连接时,不仅在控制台窗口打印输出“Connect Success!”+客户端IP地址+连接号,而且服务器还给客户端发送数据“Connect Success!”+客户端IP地址+连接号。
改造后的新连接方法程序代码如下:
- static void appServer_NewSessionConnected(AppSession session)
- {
- Console.WriteLine("Connect Success! " + session.RemoteEndPoint);
- session.Send("Connect Success! " + session.RemoteEndPoint);
- }
验证:
下面是运行效果,当先运行服务器程序,然后运行SocketTool工具软件, SocketTool工具连接服务器的IP地址输入127.0.0.1,端口号输入2021 ,当在SocketTool工具软件上点击【连接】按钮后:
(1)、服务器的控制台窗口打印输出“Connect Success! 127.0.0.1:50173”
(2)、服务器给客户端发送数据“Connect Success! 127.0.0.1:50173”
三、服务器在会话事件处理方法中给客户端发送数据
服务器在会话事件处理方法检测到客户端给服务器发送数据的key为1时,仅仅在控制台窗口打印输出“Hello World”。检测到客户端给服务器发送数据的key为2时,仅仅在控制台窗口打印输出“SuperSocket Demo”。检测到客户端给服务器发送数据的key为3时,仅仅在控制台窗口打印输出客户端发送的数据。
现在我们改造一下:
1、服务器在会话事件处理方法检测到客户端给服务器发送数据的key为1时
(1)、在控制台窗口打印输出“Hello World”。
(2)、服务器给客户端发送数据“1. Hello Word”。
2、服务器在会话事件处理方法检测到客户端给服务器发送数据的key为2时
(1)、在控制台窗口打印输出“SuperSocket Demo”。
(2)、服务器给客户端发送数据“2. SuperSocket Demo”。
3、服务器在会话事件处理方法检测到客户端给服务器发送数据的key为3时
(1)、在控制台窗口打印输出客户端发送的数据。
(2)、服务器给客户端发送数据客户端发送的数据。
改造后的会话事件处理方法程序代码如下:
- 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");
- session.Send("1. Hello Word");
- break;
- case "2":
- Console.WriteLine("SuperSocket Demo");
- session.Send("2. SuperSocket Demo");
- break;
- case "3":
- Console.WriteLine(body);
- session.Send(body);
- break;
- }
- }
验证:
下面是运行效果,当先运行服务器程序,然后运行SocketTool工具软件, SocketTool工具连接服务器的IP地址输入127.0.0.1,端口号输入2021 ,然后在SocketTool工具软件上点击【连接】按钮,服务器和客户端连接成功。
1、SocketTool工具发送数据"1"
在SocketTool工具输入发送数据“1”(警告:输入数字1后,必须要按回车键,因为SuperSocket要求报文的结束符必须是\r\n,否则不予处理)。
我们观察到客户端发送数据“1”后,服务器在控制台窗口打印输出“Hello World”,然后服务器给客户端发送数据“1. Hello Word”。
2、SocketTool工具发送数据"2"
在SocketTool工具输入发送数据“2”(警告:输入数字2后,必须要按回车键,因为SuperSocket要求报文的结束符必须是\r\n,否则不予处理)。
我们观察到客户端发送数据“2”后,服务器在控制台窗口打印输出“ SuperSocket Demo”,然后服务器给客户端发送数据“2. SuperSocket Demo”。
3、SocketTool工具发送数据"3 I love SuperSocket"
在SocketTool工具输入发送数据“3 I love SuperSocket”(警告:输入“3 I love SuperSocket”后,必须要按回车键,因为SuperSocket要求报文的结束符必须是\r\n,否则不予处理;另外3和I之间必须有1个空格)。
我们观察到客户端发送数据“3 I love SuperSocket”后,服务器在控制台窗口打印输出“I love SuperSocket”,然后服务器给客户端发送数据“I love SuperSocket”。
验证完毕,服务器给客户端发送数据OK。
四、源程序
- 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 SuperSocket服务器和客户端双向通信
- {
- 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_NewSessionConnected(AppSession session)
- {
- Console.WriteLine("已连接! " + session.RemoteEndPoint);
- session.Send("Connect Success! " + session.RemoteEndPoint);
- }
-
-
- 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");
- session.Send("1. Hello World");
- break;
- case "2":
- Console.WriteLine("SuperSocket Demo");
- session.Send("2. SuperScoket Demo");
- break;
- case "3":
- Console.WriteLine(body);
- session.Send(body);
- break;
- }
- }
-
-
- static void appServer_SessionClosed(AppSession session, CloseReason value)
- {
- string ipAddress_Close = session.RemoteEndPoint.ToString();
-
- Console.WriteLine("已关闭连接! " + ipAddress_Close);
- }
- }
- }
标签:教程,Console,SuperSocket,手把手,appServer,WriteLine,服务器,客户端
From: https://www.cnblogs.com/castlewu/p/17564668.html