前面已经了解了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实例。官方对这个协议的使用并没有具体描述,后期需要使用时进行具体学习了解。
 

最新文章

  1. php有效的过滤html标签,js代码,css样式标签
  2. JAVA基础知识之NIO.2——Path,Paths,Files
  3. node连接--MongoDB
  4. 关于如何使用Navicat(11.1.13) for MySQL如何创建存储过程
  5. Spring框架学习之第5节
  6. Combotree,datebox 启用 禁用
  7. 针对苹果最新审核要求 为应用兼容IPv6
  8. Python 学习入门(20)—— 循环
  9. 浅谈 var 关键字
  10. Canal使用小结
  11. Dynamics 365中的非交互式账号(Non-interactive User)介绍
  12. 【模板小程序】任意长度非负十进制数转化为二进制(java实现)
  13. The history of programming languages.(transshipment) + Personal understanding and prediction
  14. B. Forgery
  15. 使用Java类库POI生成简易的Excel报表
  16. css 伪类: 1)a:link , a:visited, a:hover, a:active 2):first-child
  17. jsp页面用struts2标签展示List<Object>类型的数据
  18. [javaSE] 异常捕获
  19. C#连接SQL server数据库
  20. 【刷题】SPOJ 8222 NSUBSTR - Substrings

热门文章

  1. 进程组与会话 Linux Process Groups and Sessions
  2. poj 2446 Chessboard (二分图利用奇偶性匹配)
  3. 18、Cocos2dx 3.0游戏开发找小三之cocos2d-x,请问你是怎么调度的咩
  4. 通过第三方工具体验Microsoft Graph
  5. TextMesh Pro 超链接解析失败
  6. flask开发没有解决的bug记录
  7. 关于SQLALCHEMY之(一)
  8. 体验mssql-cli
  9. 第一安装oracle数据库后,需要创建一个用户,给用户解锁并赋予权限
  10. docker容器自动退出的问题