Fork me on GitHub

SuperSocket 1.5 Documentation译文 5 ----- 内置的命令行协议

什么是协议?

“协议”是什么?很多人可能会回答“TCP”或“UDP”. 但是,建立一个网络应用程序,TCP或UDP是不够的. TCP和UDP是传输层协议.如果你只定义了传输层的协议. 想让两个端点之间在网络上会话,这是远远不够的,你需要定义你的应用层协议,将接收到的二进制数据转换为您的应用程序可以理解的。

内置的命令行协议

命令行协议是一种广泛使用的协议,很多协议,如Telnet,SMTP,POP3和FTP协议是基于命令行协议等. 如果你没有一个自定义的协议,SuperSocket将使用默认的命令行协议,这种协议能够简化开发。

命令行协议定义了每个请求都必须一个回车符“\ r\ n”结束。

如果你在SuperSocket使用命令行协议,所有的请求都将转化为StringRequestInfo实例。

StringRequestInfo是这样定义的:

public class StringRequestInfo
{
    public string Key { get; }

    public string Body { get; }

    public string[] Parameters { get; }

    /*
    其他属性和方法
    */
}

由于内置的命令行协议在SuperSocket使用空格分割请求密钥和参数,因此,当客户端发送的数据到服务器:

"LOGIN kerry 123456" + NewLine

SuperSocket服务器将接收到StringRequestInfo实例,请求信息实例的属性是:

Key: "LOGIN"
Body: "kerry 123456";
Parameters: ["kerry", "123456"]

如果你定义了一个名称为“LOGIN”的命令,该命令的ExecuteCommand方法将以StringRequestInfo作为参数被执行:

public class LOGIN : CommandBase<AppSession, StringRequestInfo>
{
    public override void ExecuteCommand(AppSession session, StringRequestInfo requestInfo)
    {
        //Implement your business logic
    }
}

 

自定义命令行协议

有些用户可能有不同的请求格式,例如:

"LOGIN:kerry,12345" + NewLine

 

请求的key与body以字符“:”分隔,parameters 以字符','分隔. 这种要求可以很容易得到支持,扩展的命令行协议,如下面的代码:

public class YourServer : AppServer<YourSession>
{
    public YourServer()
        : base(new CommandLineReceiveFilterFactory(Encoding.Default, new BasicRequestInfoParser(":", ",")))
    {

    }
}

 

如果你想更深入的自定义请求格式, 你可以实现一个RequestInfoParser基类的接口IRequestInfoParser,然后在自己的RequestInfoParser实例化时,实例化CommandLineReceiveFilterFactory的实例:

public class YourServer : AppServer<YourSession>
{
    public YourServer()
        : base(new CommandLineReceiveFilterFactory(Encoding.Default, new YourRequestInfoParser()))
    {

    }
}

 

posted @ 2013-01-17 23:35  逗豆豆  阅读(859)  评论(0编辑  收藏  举报