netty

http://www.blogjava.net/hankchen/archive/2012/02/04/369378.html

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。

package 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}

你可能感兴趣的:(框架,网络,netty)