前面已经了解了supersocket的一些基本的属性及相关的方法,下面就进入重点的学习内容,通信协议。在没有看官方的文档之前,对于协议的理解首先想到的是TCP和UDP协议。TCP 和 UDP 是传输层协议。在Socket程序中仅仅定义了传输层协议是不能让网络的两端进行通信的。我们需要定义应用层通信协议把我们接收到的二进制数据转化成程序能理解的请求。
命令行协议是一种被广泛应用的协议。一些成熟的协议如 Telnet, SMTP, POP3 和 FTP 都是基于命令行协议的。 在SuperSocket 中,如果我们没有自定义协议的话,SuperSocket默认的协议就是命令行协议 ,这样就极大的简化了基于此类协议的开发。命令行协议定义了每个请求必须以回车换行结尾 "\r\n"。
SuperSocket设计了两个RequestInfo类:StringRequestInfo 和BinaryRequestInfo。
1、如果我们在 SuperSocket 中使用命令行协议,所有接收到的数据将会翻译成 StringRequestInfo 实例。
我们来看一下StringRequestInfo的定义:
public class StringRequestInfo {
public string Key { get; }
public string Body { get; }
public string[] Parameters { get; }
/* Other properties and methods */
}
StringRequestInfo有三个属性, Key是这个命令行的命令名,是用于关联Command的字符串;Data是一个命令的参数部分;Parameters是一个命令的参数列表。
因为CommandLineProtocol默认的CommandParser是用空格来区分命令名和参数,所以当客户端发送数据
"ADD 3 4" + 换行符
到服务器端时,服务器端会收到一个StringRequestInfo的实例cmdInfo, 实例各个属性值如下:
cmdInfo.Key = "ADD";
cmdInfo.Data = "3 4";
cmdInfo.Parameters = {"3 4"}
为了更好理解和明白,我们看一下调试的参数:
运行结果
看到这里StringRequestInfo 实例是不是已经明白了。其实SuperSocket不仅仅只能解析这些这种内置命令行协议,在不同的业务场景发生请求的格式可能都不一样。在某些协议中命令和参数,参数和参数之间的分隔符不是用空格,而是其它字符,在这种情况我们就需要重新设置CommandLineProtocol的CommandParser了。SuperSocket内建的BasicCommandParser可以直接设置命令名和参数,参数与参数之间的分隔符。
例如:协议命令名和参数之间用":"分隔,参数与参数之间用","分割,形如"ADD:3,4"。要实现这样的命令解析,我们只需用":"和","为参数来实例化BasicCommandParser然后赋值给CommandLineProtocol实例即可,代码如下:
MyServer类修改位置:
如果想更深度的定义请求的格式, 我们可以基于接口 IRequestInfoParser 来实现一个 TestRequestInfoParser 类, 然后当实例化 CommandLineReceiveFilterFactory 时传入拟定一个 TestRequestInfoParser 实例:
例如格式变更为HL:ECHO:data数据
测试结果:
2、如果我们在SuperSocket中使用二进制协议,所有接收到的数据将会翻译成BinaryRequestInfo实例。官方对这个协议的使用并没有具体描述,后期需要使用时进行具体学习了解。
本文参考官方文档:内置命令行协议http://docs.supersocket.net/v1-6/zh-CN/The-Built-in-Command-Line-Protocol