应用层协议是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()))
{
}
}