• 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()))
        {
     
        }
    }
    作者:江振宇
    出处:http://jzywh.cnblogs.com
    本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
  • 相关阅读:
    P3162 [CQOI2012]组装
    P3161 [CQOI2012]模拟工厂
    P3158 [CQOI2011]放棋子
    P3154 [CQOI2009]循环赛
    zabbix部署监控端(server)以及页面优化
    zabbix-agent端自定义监控项(free -m)服务器内存使用率
    java应用系统运行速度慢的解决方法
    at org.apache.hadoop.hbase.tmpl.master.BackupMasterStatusTmplImpl.renderNoFlush(BackupMasterStatusTm
    解决Hbase启动后,hmaster会在几秒钟后自动关闭(停掉)!!!
    全网最详细的Hadoop HA集群启动后,两个namenode都是standby的解决办法(图文详解)
  • 原文地址:https://www.cnblogs.com/jzywh/p/2032186.html
Copyright © 2020-2023  润新知