NIO通讯框架之阿堂教程:Mina学习笔记-高级进阶篇(三)

来源:互联网 发布:黑莓q5软件 编辑:程序博客网 时间:2024/04/25 05:03

哦,前段时间阿堂一直比较忙,也没有写些什么了,想着高级进阶篇一直没有去弄,心中有觉得有些什么事情没有完成似的,所以就有了此文了。
        这里阿堂要和网友分享的是自定义协议编解码,自定义协议是使用最广泛的,因为它非常的灵活!当然也就有一定的难度了。
        这里阿堂为了偷懒,就直接用一网友的demo来说明了,不过,我感觉它的这个demo说得太麻烦了,实际这样会增加学习者的难度。不过,也没有关系啦!细心一点看,其实,也不复杂的!
第一步:制定协议:
协议需求:向服务端发送请求(频道的ID和说明文字),返回响应结果(该频道下所有的节目信息);
协议格式如下
请求格式
NIO通讯框架之阿堂教程:Mina学习笔记-高级进阶篇(三)



响应格式
NIO通讯框架之阿堂教程:Mina学习笔记-高级进阶篇(三)



协议解释如下:
1. 协议前两个字节(16Bits)是协议的唯一标识值; 如上:请求部分的tag = 0x0001,响应部分的 tag = 0x8001
2. 接着四个字节(32Bits)是传输消息的长度;

3. 接下来是数据区;

分析请求部分:

图片

请求部分是客户端(机顶盒)向服务端发送的请求;
协议I的请求只发送了两个个参数:channelID和channel_dec(频道描述信息)
 各个参数分析:
a. descriptor tag:请求的唯一标识; -- 2个字节
b. descriptor length:数据区长度; -- 4个字节
c. ID:channelID; -- 2个字节
d. channel_dec_len:频道说明信息的字节长度 -- 1个字节
e. for循环:存放频道说明信息的真实数据(字节数组中)

响应部分分析略……
// ===================协议格式总结===========================
前面2个部分称为报文头,固定6个字节;
中间1个部分称为基本数据区,用Java的8个基本数据类型描述;
最后的部分称为真实数据区,所有String类型的信息都放在这里;
基本数据区+真实数据区 =数据区
协议格式:报文头+数据区
NIO通讯框架之阿堂教程:Mina学习笔记-高级进阶篇(三)



总之,对于基本数据类型,直接存放在基本数据区,对于String类型,在基本数据区描述它的长度和在真实数据区的地址,然后存在在真实数据区;而Java对象,则是把对象属性分解为基本数据类型和String类型发送;

 因此,解码必须获得三个信息:
a. 请求标识:根据请求的不同进行不同的解码
b. 数据区总长度:定是否接受数据成功;
c. 偏移地址:知道真实数据区位置,就可以解码String数据;
图示如下:
NIO通讯框架之阿堂教程:Mina学习笔记-高级进阶篇(三)


阿堂在本地测试效果图如下
NIO通讯框架之阿堂教程:Mina学习笔记-高级进阶篇(三)

NIO通讯框架之阿堂教程:Mina学习笔记-高级进阶篇(三)
NIO通讯框架之阿堂教程:Mina学习笔记-高级进阶篇(三)


NIO通讯框架之阿堂教程:Mina学习笔记-高级进阶篇(三)



 




 第二步 编码(略)

相关测试代码,由于文件较多,阿堂就不粘上来了,如果感兴趣的网友,可以给阿堂留下email,我会单独发送给你的!

0 0