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 - 结束符协议)
C# SuperSocket 手把手教你入门 傻瓜教程---9(CountSpliterReceiveFilter - 固定数量分隔符协议)使用COMMAND
C# SuperSocket 手把手教你入门 傻瓜教程---10(CountSpliterReceiveFilter - 固定数量分隔符协议)不使用COMMAND
目录
C# SuperSocket 手把手教你入门 傻瓜教程系列教程
二、创建一个CountSpliterReceiveFilter( 固定数量分隔符协议)工程项目
三、安装SuperSocket和SuperSocket.Engine
1、工程项目中添加一个自定义类CountSpliterReceiveFilterSession类编辑
2、CountSpliterReceiveFilterSession类完整的代码如下:
1、工程项目中添加一个自定义类CountSpliterReceiveFilterServer
2、CountSpliterReceiveFilterServer类完整的代码如下:
一、前言
上一篇文章(1条消息) C# SuperSocket 手把手教你入门 傻瓜教程---9(CountSpliterReceiveFilter - 固定数量分隔符协议)使用COMMAND_ba_wang_mao的博客-CSDN博客 我们实现CountSpliterReceiveFilter - 固定数量分隔符协议。使用了COMMAND,创建了一个自定义类LOGIN作为KEY,因此客户端发送字符串“#LOGIN#part1#part2#part3#part4#part5#part6#",服务器才能识别,最后用App.Config配置文件启动服务器。
本篇文章我们仍然实现CountSpliterReceiveFilter - 固定数量分隔符协议,只不过:
(1)、不使用COMMAND。
不需要创建自定义类作为KEY,因此客户端发送字符串“#part1#part2#part3#part4#part5#part6#part7#",服务器就可以识别。
(2)、不使用App.Config配置文件启动服务器。
实现CountSpliterReceiveFilter - 固定数量分隔符协议,我们只需要在自定义AppServer类中实现如下代码即可。
using SuperSocket.Common;
using SuperSocket.SocketBase;
using SuperSocket.SocketBase.Protocol;
using SuperSocket.SocketBase.Config;
using SuperSocket.SocketEngine;
using SuperSocket.Facility.Protocol;
namespace SuperSocketCountSpliterReceiveFilter
{
public class CountSpliterReceiveFilterServer:AppServer<CountSpliterReceiveFilterSession>
{
/// 请求格式:#part1#part2#part3#part4#part5#part6#part7#
public CountSpliterReceiveFilterServer()
: base(new CountSpliterReceiveFilterFactory((byte)'#', 8))
//8个分隔符,7个参数。除使用默认的过滤工厂,还可以参照上一个实例定制协议
{
}
二、创建一个CountSpliterReceiveFilter( 固定数量分隔符协议)工程项目
新建一个SuperSocket服务器项目SuperSocketCountSpliterReceiveFilter,参见下图。
三、安装SuperSocket和SuperSocket.Engine
1、进入【管理NuGet程序包】
鼠标右键单击【引用】,弹出下拉菜单,在下拉菜单中选中【管理NuGet程序包(N)】
2、安装SuperSocket
(1)、【浏览】选项卡下面的输入框中输入SuperSocket
(2)、过一会下面会出现"SuperSocket ......下载 v1.6.6.1"
(3)、鼠标点击"SuperSocket ......下载 v1.6.6.1",右边会出现"版本:最新稳定版1.6.6.1"
(4)、点击"版本:最新稳定版1.6.6.1"右边的【安装】按钮
3、安装SuperSocket.Engine
(1)、鼠标点击"SuperSocket.Engine ",右边会出现"版本:1.6.6.1"
(2)、点击"版本:1.6.6.1"右边的【安装】按钮
四、自定义AppSession类
AppSession 代表一个和客户端的逻辑连接,基于连接的操作应该放在该类之中。你可以用该类的实例发送数据到客户端,接收客户端发送的数据或者关闭连接。
使用方法:创建自定义类CountSpliterReceiveFilterSession,继承AppSession类并重写AppSession类的方法(注意:一个AppSession对象对应一个连接)
1、工程项目中添加一个自定义类CountSpliterReceiveFilterSession类
![](https://i-blog.csdnimg.cn/blog_migrate/78c9fd0af4c0dafd0bd0aa0d5401045b.png)
2、CountSpliterReceiveFilterSession类完整的代码如下:
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;
using SuperSocket.SocketBase.Config;
using SuperSocket.SocketEngine;
namespace SuperSocketCountSpliterReceiveFilter
{
public class CountSpliterReceiveFilterSession : AppSession<CountSpliterReceiveFilterSession>
{
public override void Send(string message)
{
Console.WriteLine("发送消息:" + message);
base.Send(message);
}
protected override void OnSessionStarted()
{
//输出客户端IP地址
Console.WriteLine(this.LocalEndPoint.Address.ToString());
this.Send("Hello User,Welcome to SuperSocket Telnet Server!");
}
/// <summary>
/// 连接关闭
/// </summary>
/// <param name="reason"></param>
protected override void OnSessionClosed(CloseReason reason)
{
base.OnSessionClosed(reason);
}
protected override void HandleUnknownRequest(StringRequestInfo requestInfo)
{
Console.WriteLine($"遇到未知的请求 Key:" + requestInfo.Key + $" Body:" + requestInfo.Body);
base.HandleUnknownRequest(requestInfo);
}
/// <summary>
/// 捕捉异常并输出
/// </summary>
/// <param name="e"></param>
protected override void HandleException(Exception e)
{
this.Send("error: {0}", e.Message);
}
}
}
五、自定义AppServer类
AppServer 代表了监听客户端连接,承载TCP连接的服务器实例。理想情况下,我们可以通过AppServer实例获取任何你想要的客户端连接,服务器级别的操作和逻辑应该定义在此类之中。
使用方法:创建自定义类CountSpliterReceiveFilterServer,继承AppServer类并重写AppServer类的方法
1、工程项目中添加一个自定义类CountSpliterReceiveFilterServer
2、CountSpliterReceiveFilterServer类完整的代码如下:
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;
using SuperSocket.SocketBase.Config;
using SuperSocket.SocketEngine;
using SuperSocket.Facility.Protocol;
namespace SuperSocketCountSpliterReceiveFilter
{
public class CountSpliterReceiveFilterServer:AppServer<CountSpliterReceiveFilterSession>
{
/// 请求格式:#part1#part2#part3#part4#part5#part6#part7#
public CountSpliterReceiveFilterServer()
: base(new CountSpliterReceiveFilterFactory((byte)'#', 8)) //8个分隔符,7个参数。除使用默认的过滤工厂,还可以参照上一个实例定制协议
{
}
protected override bool Setup(IRootConfig rootConfig, IServerConfig config)
{
Console.WriteLine("正在准备配置文件");
return base.Setup(rootConfig, config);
}
protected override void OnStarted()
{
Console.WriteLine("服务已开始");
base.OnStarted();
}
protected override void OnStopped()
{
Console.WriteLine("服务已停止");
base.OnStopped();
}
/// <summary>
/// 输出新连接信息
/// </summary>
/// <param name="session"></param>
protected override void OnNewSessionConnected(CountSpliterReceiveFilterSession session)
{
base.OnNewSessionConnected(session);
//输出客户端IP地址
Console.Write("\r\n" + session.LocalEndPoint.Address.ToString() + ":连接");
}
/// <summary>
/// 输出断开连接信息
/// </summary>
/// <param name="session"></param>
/// <param name="reason"></param>
protected override void OnSessionClosed(CountSpliterReceiveFilterSession session, CloseReason reason)
{
base.OnSessionClosed(session, reason);
Console.Write("\r\n" + session.LocalEndPoint.Address.ToString() + ":断开连接");
}
}
}
我们只需要在自定义AppServer类(CountSpliterReceiveFilterServer)中实现如下代码即可实现CountSpliterReceiveFilter - 固定数量分隔符协议。
using SuperSocket.Common;
using SuperSocket.SocketBase;
using SuperSocket.SocketBase.Protocol;
using SuperSocket.SocketBase.Config;
using SuperSocket.SocketEngine;
using SuperSocket.Facility.Protocol;
namespace SuperSocketCountSpliterReceiveFilter
{
public class CountSpliterReceiveFilterServer:AppServer<CountSpliterReceiveFilterSession>
{
/// 请求格式:#part1#part2#part3#part4#part5#part6#part7#
public CountSpliterReceiveFilterServer()
: base(new CountSpliterReceiveFilterFactory((byte)'#', 8)) //8个分隔符,7个参数。除使用默认的过滤工厂,还可以参照上一个实例定制协议
{
}
六、program.cs
本篇文章我们不使用App.Config配置文件启动服务器。
program类完整的代码如下:
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;
using SuperSocket.SocketEngine;
namespace SuperSocketCountSpliterReceiveFilter
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("请按任何键进行启动SuperSocket服务!");
Console.ReadKey();
Console.WriteLine();
var CountSpliterReceiveFilterServer = new CountSpliterReceiveFilterServer();
// 设置端口号
int port = 2017;
//启动应用服务端口
if (!CountSpliterReceiveFilterServer.Setup(port)) //启动时监听端口2017
{
Console.WriteLine("服务端口启动失败!");
Console.ReadKey();
return;
}
Console.WriteLine();
//注册连接事件
CountSpliterReceiveFilterServer.NewSessionConnected += CountSpliterReceiveFilterServer_NewSessionConnected;
//注册请求事件
CountSpliterReceiveFilterServer.NewRequestReceived += CountSpliterReceiveFilterServer_NewRequestReceived;
//注册Session关闭事件
CountSpliterReceiveFilterServer.SessionClosed += CountSpliterReceiveFilterServer_SessionClosed;
//尝试启动应用服务
if (!CountSpliterReceiveFilterServer.Start())
{
Console.WriteLine("服务启动失败!");
Console.ReadKey();
return;
}
Console.WriteLine("服务器状态:" + CountSpliterReceiveFilterServer.State.ToString());
Console.WriteLine("服务启动成功,请按'q'停止服务!");
while (Console.ReadKey().KeyChar != 'q')
{
Console.WriteLine();
continue;
}
//停止服务
CountSpliterReceiveFilterServer.Stop();
Console.WriteLine("服务已停止!");
Console.ReadKey();
}
static void CountSpliterReceiveFilterServer_SessionClosed(CountSpliterReceiveFilterSession session, SuperSocket.SocketBase.CloseReason value)
{
Console.WriteLine(session.RemoteEndPoint.ToString() + "连接断开. 断开原因:" + value);
}
static void CountSpliterReceiveFilterServer_NewSessionConnected(CountSpliterReceiveFilterSession session)
{
Console.WriteLine(session.RemoteEndPoint.ToString() + " 已连接.");
}
/// <summary>
/// 协议并没有什么太多复杂逻辑,不需要用到命令模式,直接用这种方式就可以了
/// </summary>
/// <param name="session"></param>
/// <param name="requestInfo"></param>
private static void CountSpliterReceiveFilterServer_NewRequestReceived(CountSpliterReceiveFilterSession session, SuperSocket.SocketBase.Protocol.StringRequestInfo requestInfo)
{
Console.WriteLine();
Console.WriteLine("数据来源: " + session.RemoteEndPoint.ToString());
Console.WriteLine("接收数据内容:" + requestInfo.Body);
}
}
}
七、验证
1、启动服务器
服务器启动成功。
2、启动客户端
3、连接客户端
连接客户端后,客户端收到服务器发送的信息:“Hello User,Welcome to SuperSocket Telnet Server!”
4、客户端发送字符串“#part1#part2#part3#part4#part5#part6#part7#"
警告:由于使用了CountSpliterReceiveFilter - 固定数量分隔符协议,因此KEY和BODY之间的分隔符为#,参数之间的分隔符也为#,而且字符串结尾不需要添加回车换行符\r\n。
为了更好理解和明白,我们看一下调试的参数:
八、源程序
源程序参见如下链接:
(4条消息) C#SuperSocketCountSpliterReceiveFilter-固定数量分隔符协议)不使用COMMAND-C#文档类资源-CSDN文库
开发工具为:Visual Studio 2017
源程序中包含SocketTool.exe TCP&UPD测试工具
九、致谢
SuperSocket入门(五)-常用协议实现模版及FixedSizeReceiveFilter示例 - 黄昏前黎明后 - 博客园 (cnblogs.com)