SuperSocket 1.4系列文档(7) 命令行协议
应用层协议是Socket通信的基础, 而SuperSocket直接内建了命令行协议(CommandLineProtocol)。命令行协议是一种应用非常广泛的协议,例如我们常见的Telnet, SMTP, POP3和FTP等等都是以命令行协议为基础的。如果你没有自定义协议的话,SuperSocket默认的协议就是命令行协议 ,这样就极大的简化了基于此类协议的开发。
命令行协议的StringCommandInfo
命令行协议的CommandInfo是StringCommandInfo这个类型:
public class StringCommandInfo
{
string Key { get; set; }
string Data { get; set; }
string[] Parameters { get; set; }
}
StringCommandInfo有三个属性, Key是这个命令行的命令名,是用于关联Command的字符串;Data是一个命令的参数部分;Parameters是一个命令的参数列表。
因为CommandLineProtocol默认的CommandParser是用空格来区分命令名和参数,
所以当客户端发送
"LOGIN kerry 123456" + 换行符
到服务器端时,服务器端会收到一个StringCommandInfo的实例cmdInfo, 实例各个属性值如下:
cmdIndo.Key = "LOGIN";
cmdInfo.Data = "kerry 123456";
cmdInfo.Parameters = {"kerry", "123456"}
自定义CommandParser
在某些协议中命令和参数,参数和参数之间的分隔符不是用空格,而是其它字符,在这种情况写你就需要重新设置CommandLineProtocol的CommandParser了。
SuperSocket内建的BasicCommandParser可以直接设置命令名和参数,参数与参数之间的分隔符。例如你的协议命令名和参数之间用":"分隔,参数与参数之间用","分割,形如"LOGIN:kerry,12345"。要实现这样的命令解析,你只需用":"和","为参数来实例化BasicCommandParser然后赋给CommandLineProtocol实例即可,代码如下:
public class YourServer : AppServer<YourSession>
{
public YourServer()
: base(new CommandLineProtocol(new BasicCommandParser(":", ",")))
{
}
}
有些协议无法简单的用两个分隔符来解析, 那我们就需要完完全全的自定义CommandParser来实现了。假如有这样的命令"CMD:ECHO AabSfght5656D5Cfa5==", 命令名前为"CMD:", 后与参数之间是通过空格分隔,但是参数部分是多个参数用空格连接成的字符串然后经过base64编码所得到的字符串。这样就需要你自己实现接口ICommandParser的类了,代码如下:
/// <summary>
/// CMD:ECHO AabSfght5656D5Cfa5==
/// </summary>
public class CustomCommandParser : ICommandParser
{
#region ICommandParser Members
public StringCommandInfo ParseCommand(string command)
{
if(!command.StartsWith("CMD:"))
return null;
command = command.Substring(4);
string[] data = command.Split(' ');
return new StringCommandInfo(data[0], data[1],
Encoding.ASCII.GetString(Convert.FromBase64String(data[1])).Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries));
}
#endregion
}
public class YourServer : AppServer<YourSession>
{
public YourServer()
: base(new CommandLineProtocol(new CustomCommandParser()))
{
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架