使用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。
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}
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