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())) { } }