现在的位置: 首页 > 综合 > 正文

二进制协议处理

2013年09月06日 ⁄ 综合 ⁄ 共 5425字 ⁄ 字号 评论关闭

使用Netty实现通用二进制协议的高效数据传输

Netty是一个高性能的NIO通信框架,提供异步的、事件驱动的网络编程模型。使用Netty可以方便用户开发各种常用协议的网络程序。例如:TCP、UDP、HTTP等等。

Netty的最新版本是3.2.7,官网地址是:http://www.jboss.org/netty

本文的主要目的是基于Netty实现一个通用二进制协议的高效数据传输。协议是通用的二进制协议,高效并且扩展性很好。

一个好的协议有两个标准:

(1)生成的传输数据要少,即数据压缩比要高。这样可以减少网络开销。

(2)传输数据和业务对象之间的转换速度要快。

(友情提示:本博文章欢迎转载,但请注明出处:hankchen,http://www.blogjava.net/hankchen

一、协议的定义

无论是请求还是响应,报文都由一个通用报文头和实际数据组成。报文头在前,数据在后。

(1)报文头:由数据解析类型,数据解析方法,编码,扩展字节,包长度组成,共16个字节:
       编码方式(1byte)、加密(1byte)、扩展1(1byte)、扩展2(1byte)、会话ID(4byte)、命令或者结果码(4byte)、数据包长(4byte)
(2)数据:由数据包长指定。请求或回复数据。类型对应为JAVA的Map<String,String>
       数据格式定义:
       字段1键名长度    字段1键名 字段1值长度    字段1值
       字段2键名长度    字段2键名 字段2值长度    字段2值
       字段3键名长度    字段3键名 字段3值长度    字段3值
       …    …    …    …
       长度为整型,占4个字节

  代码中用两个Vo对象来表示:XLRequest和XLResponse。

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->  1package
org.jboss.netty.example.xlsvr.vo;
  2
  3import java.util.HashMap;
  4import java.util.Map;
  5
  6/**
  7
@author hankchen
10 *  2012-2-3 下午02:46:52
11 */

12
13
14/**
15 * 响应数据
16 */

17
18/**
19 * 通用协议介绍
20 *

21 * 通用报文格式:无论是请求还是响应,报文都由一个通用报文头和实际数据组成。报文头在前,数据在后
22 * (1)报文头:由数据解析类型,数据解析方法,编码,扩展字节,包长度组成,共16个字节:
23 * 编码方式(1byte)、加密(1byte)、扩展1(1byte)、扩展2(1byte)、会话ID(4byte)、命令或者结果码(4byte)、包长(4byte)
24 * (2)数据:由包长指定。请求或回复数据。类型对应为JAVA的Map<String,String>
25 * 数据格式定义:
26 * 字段1键名长度    字段1键名 字段1值长度    字段1值
27 * 字段2键名长度    字段2键名 字段2值长度    字段2值
28 * 字段3键名长度    字段3键名 字段3值长度    字段3值
29 * …    …    …    …
30 * 长度为整型,占4个字节
31 */

32public class
XLResponse
{
33   
private byte encode;// 数据编码格式。已定义:0:UTF-8,1:GBK,2:GB2312,3:ISO8859-1
34   
private byte encrypt;// 加密类型。0表示不加密
35   
private byte extend1;// 用于扩展协议。暂未定义任何值
36   
private byte extend2;// 用于扩展协议。暂未定义任何值
37   
private int sessionid;// 会话ID
38   
private int result;// 结果码
39   
private int length;// 数据包长
40   

41   
private Map<String,String> values=new
HashMap
<String, String>();
42   

43   
private String ip;
44   

45   
public void setValue(String key,String value){
46        values.put(key, value);
47    }

48   

49   
public String getValue(String key){
50       
if (key==null)
{
51           
return null;
52        }

53       
return values.get(key);
54    }

55
56   
public byte getEncode()
{
57       
return encode;
58    }

59
60   
public void setEncode(byte encode)
{
61       
this.encode
= encode;
62    }

63
64   
public byte getEncrypt()
{
65       
return encrypt;
66    }

67
68   
public void setEncrypt(byte encrypt)
{
69       
this.encrypt
= encrypt;
70    }

71
72   
public byte getExtend1()
{
73       
return extend1;
74    }

75
76   
public void setExtend1(byte extend1)
{
77       
this.extend1
= extend1;
78    }

79
80   
public byte getExtend2()
{
81       
return extend2;
82    }

83
84   
public void setExtend2(byte extend2)
{
85       
this.extend2
= extend2;
86    }

87
88   
public int getSessionid()
{
89       
return sessionid;
90    }

91
92   
public void setSessionid(int sessionid)
{
93       
this.sessionid
= sessionid;
94    }

95
96   
public int getResult()
{
97       
return result;
98    }

99
100   
public void setResult(int result)
{
101       
this.result
= result;
102    }

103
104   
public int getLength()
{
105       
return length;
106    }

107
108   
public void setLength(int length)
{
109       
this.length
= length;
110    }

111
112   
public Map<String, String> getValues()
{
113       
return values;
114    }

115
116   
public String getIp()
{
117       
return ip;
118    }

119
120   
public void setIp(String ip)
{
121       
this.ip
= ip;
122    }

123
124   
public void setValues(Map<String, String>
values)
{
125       
this.values
= values;
126    }

127
128    @Override
129   
public String toString()
{
130       
return "XLResponse [encode=" +
encode
+ ", encrypt=" +
encrypt
+ ", extend1=" +
extend1
+ ", extend2=" +
extend2
131               
+ ", sessionid=" +
sessionid
+ ", result=" +
result
+ ", length=" +
length
+ ", values=" +
values
+ ", ip=" +
ip
+ "]";
132    }

133}

 

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->  1package
org.jboss.netty.example.xlsvr.vo;
  2
  3import java.util.HashMap;
  4import java.util.Map;
  5
  6/**
  7
@author hankchen
  8 *  2012-2-3 下午02:46:41
  9 */

10
11/**
12 * 请求数据
13 */

14
15/**
16 * 通用协议介绍
17 *

18 * 通用报文格式:无论是请求还是响应,报文都由一个通用报文头和实际数据组成。报文头在前,数据在后
19 * (1)报文头:由数据解析类型,数据解析方法,编码,扩展字节,包长度组成,共16个字节:
20 * 编码方式(1byte)、加密(1byte)、扩展1(1byte)、扩展2(1byte)、会话ID(4byte)、命令或者结果码(4byte)、包长(4byte)
21 * (2)数据:由包长指定。请求或回复数据。类型对应为JAVA的Map<String,String>
22 * 数据格式定义:
23 * 字段1键名长度    字段1键名 字段1值长度    字段1值
24 * 字段2键名长度    字段2键名 字段2值长度    字段2值
25 * 字段3键名长度    字段3键名 字段3值长度    字段3值
26 * …    …    …    …
27 * 长度为整型,占4个字节
28 */

29public class
XLRequest
{
30   
private byte encode;// 数据编码格式。已定义:0:UTF-8,1:GBK,2:GB2312,3:ISO8859-1
31   
private byte encrypt;// 加密类型。0表示不加密
32   
private byte extend1;// 用于扩展协议。暂未定义任何值
33   
private byte extend2;// 用于扩展协议。暂未定义任何值
34   
private int sessionid;// 会话ID
35   
private int command;// 命令
36   
private int length;// 数据包长
37   

38   
private Map<String,String> params=new
HashMap
<String, String>();
//参数
39   

40   
private String ip;
41
42   
public byte getEncode()
{
43       
return encode;
44    }

45
46   
public void setEncode(byte encode)
{
47       
this.encode
= encode;
48    }

49
50   
public byte getEncrypt()
{
51       
return encrypt;
52    }

53
54   
public void setEncrypt(byte encrypt)
{
55       
this.encrypt
= encrypt;
56    }

57
58   
public byte getExtend1()
{
59       
return extend1;
60    }

61
62   
public void setExtend1(byte extend1)
{
63       
this.extend1
= extend1;
64    }

65
66   
public byte getExtend2()
{
67       
return extend2;
68    }

69
70   
public void setExtend2(byte extend2)
{
71       
this.extend2
= extend2;
72    }

73
74   
public int getSessionid()
{
75       
return sessionid;
76    }

77
78   
public void setSessionid(int sessionid)
{
79       
this.sessionid
= sessionid;
80    }

81
82   
public int getCommand()
{
83       
return command;
84
【上篇】
【下篇】

抱歉!评论已关闭.