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()))
    {
 
    }
}
posted @ 2011-04-28 20:59  江大渔  阅读(4039)  评论(7编辑  收藏  举报