天天看點

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

  1

使用Netty實作通用二進制協定的高效資料傳輸

package  org.jboss.netty.example.xlsvr.vo;

  2

使用Netty實作通用二進制協定的高效資料傳輸

  3

使用Netty實作通用二進制協定的高效資料傳輸

import  java.util.HashMap;

  4

使用Netty實作通用二進制協定的高效資料傳輸

import  java.util.Map;

  5

使用Netty實作通用二進制協定的高效資料傳輸

  6

使用Netty實作通用二進制協定的高效資料傳輸

12

使用Netty實作通用二進制協定的高效資料傳輸

13

使用Netty實作通用二進制協定的高效資料傳輸

14

使用Netty實作通用二進制協定的高效資料傳輸

17

使用Netty實作通用二進制協定的高效資料傳輸

18

使用Netty實作通用二進制協定的高效資料傳輸

32

使用Netty實作通用二進制協定的高效資料傳輸

public   class  XLResponse  {

33

使用Netty實作通用二進制協定的高效資料傳輸

    private byte encode;// 数据编码格式。已定义:0:UTF-8,1:GBK,2:GB2312,3:ISO8859-1

34

使用Netty實作通用二進制協定的高效資料傳輸

    private byte encrypt;// 加密类型。0表示不加密

35

使用Netty實作通用二進制協定的高效資料傳輸

    private byte extend1;// 用于扩展协议。暂未定义任何值

36

使用Netty實作通用二進制協定的高效資料傳輸

    private byte extend2;// 用于扩展协议。暂未定义任何值

37

使用Netty實作通用二進制協定的高效資料傳輸

    private int sessionid;// 会话ID

38

使用Netty實作通用二進制協定的高效資料傳輸

    private int result;// 结果码

39

使用Netty實作通用二進制協定的高效資料傳輸

    private int length;// 数据包长

40

使用Netty實作通用二進制協定的高效資料傳輸

    

41

使用Netty實作通用二進制協定的高效資料傳輸

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

42

使用Netty實作通用二進制協定的高效資料傳輸

    

43

使用Netty實作通用二進制協定的高效資料傳輸

    private String ip;

44

使用Netty實作通用二進制協定的高效資料傳輸

    

45

使用Netty實作通用二進制協定的高效資料傳輸

    public void setValue(String key,String value){

46

使用Netty實作通用二進制協定的高效資料傳輸

        values.put(key, value);

47

使用Netty實作通用二進制協定的高效資料傳輸

    }

48

使用Netty實作通用二進制協定的高效資料傳輸

    

49

使用Netty實作通用二進制協定的高效資料傳輸

    public String getValue(String key){

50

使用Netty實作通用二進制協定的高效資料傳輸

        if (key==null) {

51

使用Netty實作通用二進制協定的高效資料傳輸

            return null;

52

使用Netty實作通用二進制協定的高效資料傳輸

        }

53

使用Netty實作通用二進制協定的高效資料傳輸

        return values.get(key);

54

使用Netty實作通用二進制協定的高效資料傳輸

    }

55

使用Netty實作通用二進制協定的高效資料傳輸

56

使用Netty實作通用二進制協定的高效資料傳輸

    public byte getEncode() {

57

使用Netty實作通用二進制協定的高效資料傳輸

        return encode;

58

使用Netty實作通用二進制協定的高效資料傳輸

    }

59

使用Netty實作通用二進制協定的高效資料傳輸

60

使用Netty實作通用二進制協定的高效資料傳輸

    public void setEncode(byte encode) {

61

使用Netty實作通用二進制協定的高效資料傳輸

        this.encode = encode;

62

使用Netty實作通用二進制協定的高效資料傳輸

    }

63

使用Netty實作通用二進制協定的高效資料傳輸

64

使用Netty實作通用二進制協定的高效資料傳輸

    public byte getEncrypt() {

65

使用Netty實作通用二進制協定的高效資料傳輸

        return encrypt;

66

使用Netty實作通用二進制協定的高效資料傳輸

    }

67

使用Netty實作通用二進制協定的高效資料傳輸

68

使用Netty實作通用二進制協定的高效資料傳輸

    public void setEncrypt(byte encrypt) {

69

使用Netty實作通用二進制協定的高效資料傳輸

        this.encrypt = encrypt;

70

使用Netty實作通用二進制協定的高效資料傳輸

    }

71

使用Netty實作通用二進制協定的高效資料傳輸

72

使用Netty實作通用二進制協定的高效資料傳輸

    public byte getExtend1() {

73

使用Netty實作通用二進制協定的高效資料傳輸

        return extend1;

74

使用Netty實作通用二進制協定的高效資料傳輸

    }

75

使用Netty實作通用二進制協定的高效資料傳輸

76

使用Netty實作通用二進制協定的高效資料傳輸

    public void setExtend1(byte extend1) {

77

使用Netty實作通用二進制協定的高效資料傳輸

        this.extend1 = extend1;

78

使用Netty實作通用二進制協定的高效資料傳輸

    }

79

使用Netty實作通用二進制協定的高效資料傳輸

80

使用Netty實作通用二進制協定的高效資料傳輸

    public byte getExtend2() {

81

使用Netty實作通用二進制協定的高效資料傳輸

        return extend2;

82

使用Netty實作通用二進制協定的高效資料傳輸

    }

83

使用Netty實作通用二進制協定的高效資料傳輸

84

使用Netty實作通用二進制協定的高效資料傳輸

    public void setExtend2(byte extend2) {

85

使用Netty實作通用二進制協定的高效資料傳輸

        this.extend2 = extend2;

86

使用Netty實作通用二進制協定的高效資料傳輸

    }

87

使用Netty實作通用二進制協定的高效資料傳輸

88

使用Netty實作通用二進制協定的高效資料傳輸

    public int getSessionid() {

89

使用Netty實作通用二進制協定的高效資料傳輸

        return sessionid;

90

使用Netty實作通用二進制協定的高效資料傳輸

    }

91

使用Netty實作通用二進制協定的高效資料傳輸

92

使用Netty實作通用二進制協定的高效資料傳輸

    public void setSessionid(int sessionid) {

93

使用Netty實作通用二進制協定的高效資料傳輸

        this.sessionid = sessionid;

94

使用Netty實作通用二進制協定的高效資料傳輸

    }

95

使用Netty實作通用二進制協定的高效資料傳輸

96

使用Netty實作通用二進制協定的高效資料傳輸

    public int getResult() {

97

使用Netty實作通用二進制協定的高效資料傳輸

        return result;

98

使用Netty實作通用二進制協定的高效資料傳輸

    }

99

使用Netty實作通用二進制協定的高效資料傳輸

100

使用Netty實作通用二進制協定的高效資料傳輸

    public void setResult(int result) {

101

使用Netty實作通用二進制協定的高效資料傳輸

        this.result = result;

102

使用Netty實作通用二進制協定的高效資料傳輸

    }

103

使用Netty實作通用二進制協定的高效資料傳輸

104

使用Netty實作通用二進制協定的高效資料傳輸

    public int getLength() {

105

使用Netty實作通用二進制協定的高效資料傳輸

        return length;

106

使用Netty實作通用二進制協定的高效資料傳輸

    }

107

使用Netty實作通用二進制協定的高效資料傳輸

108

使用Netty實作通用二進制協定的高效資料傳輸

    public void setLength(int length) {

109

使用Netty實作通用二進制協定的高效資料傳輸

        this.length = length;

110

使用Netty實作通用二進制協定的高效資料傳輸

    }

111

使用Netty實作通用二進制協定的高效資料傳輸

112

使用Netty實作通用二進制協定的高效資料傳輸

    public Map<String, String> getValues() {

113

使用Netty實作通用二進制協定的高效資料傳輸

        return values;

114

使用Netty實作通用二進制協定的高效資料傳輸

    }

115

使用Netty實作通用二進制協定的高效資料傳輸

116

使用Netty實作通用二進制協定的高效資料傳輸

    public String getIp() {

117

使用Netty實作通用二進制協定的高效資料傳輸

        return ip;

118

使用Netty實作通用二進制協定的高效資料傳輸

    }

119

使用Netty實作通用二進制協定的高效資料傳輸

120

使用Netty實作通用二進制協定的高效資料傳輸

    public void setIp(String ip) {

121

使用Netty實作通用二進制協定的高效資料傳輸

        this.ip = ip;

122

使用Netty實作通用二進制協定的高效資料傳輸

    }

123

使用Netty實作通用二進制協定的高效資料傳輸

124

使用Netty實作通用二進制協定的高效資料傳輸

    public void setValues(Map<String, String> values) {

125

使用Netty實作通用二進制協定的高效資料傳輸

        this.values = values;

126

使用Netty實作通用二進制協定的高效資料傳輸

    }

127

使用Netty實作通用二進制協定的高效資料傳輸

128

使用Netty實作通用二進制協定的高效資料傳輸

    @Override

129

使用Netty實作通用二進制協定的高效資料傳輸

    public String toString() {

130

使用Netty實作通用二進制協定的高效資料傳輸

        return "XLResponse [encode=" + encode + ", encrypt=" + encrypt + ", extend1=" + extend1 + ", extend2=" + extend2

131

使用Netty實作通用二進制協定的高效資料傳輸

                + ", sessionid=" + sessionid + ", result=" + result + ", length=" + length + ", values=" + values + ", ip=" + ip + "]";

132

使用Netty實作通用二進制協定的高效資料傳輸

    }

133

使用Netty實作通用二進制協定的高效資料傳輸

}

 

  1

使用Netty實作通用二進制協定的高效資料傳輸

package  org.jboss.netty.example.xlsvr.vo;

  2

使用Netty實作通用二進制協定的高效資料傳輸

  3

使用Netty實作通用二進制協定的高效資料傳輸

import  java.util.HashMap;

  4

使用Netty實作通用二進制協定的高效資料傳輸

import  java.util.Map;

  5

使用Netty實作通用二進制協定的高效資料傳輸

  6

使用Netty實作通用二進制協定的高效資料傳輸

10

使用Netty實作通用二進制協定的高效資料傳輸

11

使用Netty實作通用二進制協定的高效資料傳輸

14

使用Netty實作通用二進制協定的高效資料傳輸

15

使用Netty實作通用二進制協定的高效資料傳輸

29

使用Netty實作通用二進制協定的高效資料傳輸

public   class  XLRequest  {

30

使用Netty實作通用二進制協定的高效資料傳輸

    private byte encode;// 数据编码格式。已定义:0:UTF-8,1:GBK,2:GB2312,3:ISO8859-1

31

使用Netty實作通用二進制協定的高效資料傳輸

    private byte encrypt;// 加密类型。0表示不加密

32

使用Netty實作通用二進制協定的高效資料傳輸

    private byte extend1;// 用于扩展协议。暂未定义任何值

33

使用Netty實作通用二進制協定的高效資料傳輸

    private byte extend2;// 用于扩展协议。暂未定义任何值

34

使用Netty實作通用二進制協定的高效資料傳輸

    private int sessionid;// 会话ID

35

使用Netty實作通用二進制協定的高效資料傳輸

    private int command;// 命令

36

使用Netty實作通用二進制協定的高效資料傳輸

    private int length;// 数据包长

37

使用Netty實作通用二進制協定的高效資料傳輸

    

38

使用Netty實作通用二進制協定的高效資料傳輸

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

39

使用Netty實作通用二進制協定的高效資料傳輸

    

40

使用Netty實作通用二進制協定的高效資料傳輸

    private String ip;

41

使用Netty實作通用二進制協定的高效資料傳輸

42

使用Netty實作通用二進制協定的高效資料傳輸

    public byte getEncode() {

43

使用Netty實作通用二進制協定的高效資料傳輸

        return encode;

44

使用Netty實作通用二進制協定的高效資料傳輸

    }

45

使用Netty實作通用二進制協定的高效資料傳輸

46

使用Netty實作通用二進制協定的高效資料傳輸

    public void setEncode(byte encode) {

47

使用Netty實作通用二進制協定的高效資料傳輸

        this.encode = encode;

48

使用Netty實作通用二進制協定的高效資料傳輸

    }

49

使用Netty實作通用二進制協定的高效資料傳輸

50

使用Netty實作通用二進制協定的高效資料傳輸

    public byte getEncrypt() {

51

使用Netty實作通用二進制協定的高效資料傳輸

        return encrypt;

52

使用Netty實作通用二進制協定的高效資料傳輸

    }

53

使用Netty實作通用二進制協定的高效資料傳輸

54

使用Netty實作通用二進制協定的高效資料傳輸

    public void setEncrypt(byte encrypt) {

55

使用Netty實作通用二進制協定的高效資料傳輸

        this.encrypt = encrypt;

56

使用Netty實作通用二進制協定的高效資料傳輸

    }

57

使用Netty實作通用二進制協定的高效資料傳輸

58

使用Netty實作通用二進制協定的高效資料傳輸

    public byte getExtend1() {

59

使用Netty實作通用二進制協定的高效資料傳輸

        return extend1;

60

使用Netty實作通用二進制協定的高效資料傳輸

    }

61

使用Netty實作通用二進制協定的高效資料傳輸

62

使用Netty實作通用二進制協定的高效資料傳輸

    public void setExtend1(byte extend1) {

63

使用Netty實作通用二進制協定的高效資料傳輸

        this.extend1 = extend1;

64

使用Netty實作通用二進制協定的高效資料傳輸

    }

65

使用Netty實作通用二進制協定的高效資料傳輸

66

使用Netty實作通用二進制協定的高效資料傳輸

    public byte getExtend2() {

67

使用Netty實作通用二進制協定的高效資料傳輸

        return extend2;

68

使用Netty實作通用二進制協定的高效資料傳輸

    }

69

使用Netty實作通用二進制協定的高效資料傳輸

70

使用Netty實作通用二進制協定的高效資料傳輸

    public void setExtend2(byte extend2) {

71

使用Netty實作通用二進制協定的高效資料傳輸

        this.extend2 = extend2;

72

使用Netty實作通用二進制協定的高效資料傳輸

    }

73

使用Netty實作通用二進制協定的高效資料傳輸

74

使用Netty實作通用二進制協定的高效資料傳輸

    public int getSessionid() {

75

使用Netty實作通用二進制協定的高效資料傳輸

        return sessionid;

76

使用Netty實作通用二進制協定的高效資料傳輸

    }

77

使用Netty實作通用二進制協定的高效資料傳輸

78

使用Netty實作通用二進制協定的高效資料傳輸

    public void setSessionid(int sessionid) {

79

使用Netty實作通用二進制協定的高效資料傳輸

        this.sessionid = sessionid;

80

使用Netty實作通用二進制協定的高效資料傳輸

    }

81

使用Netty實作通用二進制協定的高效資料傳輸

82

使用Netty實作通用二進制協定的高效資料傳輸

    public int getCommand() {

83

使用Netty實作通用二進制協定的高效資料傳輸

        return command;

84

使用Netty實作通用二進制協定的高效資料傳輸

    }

85

使用Netty實作通用二進制協定的高效資料傳輸

86

使用Netty實作通用二進制協定的高效資料傳輸

    public void setCommand(int command) {

87

使用Netty實作通用二進制協定的高效資料傳輸

        this.command = command;

88

使用Netty實作通用二進制協定的高效資料傳輸

    }

89

使用Netty實作通用二進制協定的高效資料傳輸

90

使用Netty實作通用二進制協定的高效資料傳輸

    public int getLength() {

91

使用Netty實作通用二進制協定的高效資料傳輸

        return length;

92

使用Netty實作通用二進制協定的高效資料傳輸

    }

93

使用Netty實作通用二進制協定的高效資料傳輸

94

使用Netty實作通用二進制協定的高效資料傳輸

    public void setLength(int length) {

95

使用Netty實作通用二進制協定的高效資料傳輸

        this.length = length;

96

使用Netty實作通用二進制協定的高效資料傳輸

    }

97

使用Netty實作通用二進制協定的高效資料傳輸

98

使用Netty實作通用二進制協定的高效資料傳輸

    public Map<String, String> getParams() {

99

使用Netty實作通用二進制協定的高效資料傳輸

        return params;

100

使用Netty實作通用二進制協定的高效資料傳輸

    }

101

使用Netty實作通用二進制協定的高效資料傳輸

    

102

使用Netty實作通用二進制協定的高效資料傳輸

    public void setValue(String key,String value){

103

使用Netty實作通用二進制協定的高效資料傳輸

        params.put(key, value);

104

使用Netty實作通用二進制協定的高效資料傳輸

    }

105

使用Netty實作通用二進制協定的高效資料傳輸

    

106

使用Netty實作通用二進制協定的高效資料傳輸

    public String getValue(String key){

107

使用Netty實作通用二進制協定的高效資料傳輸

        if (key==null) {

108

使用Netty實作通用二進制協定的高效資料傳輸

            return null;

109

使用Netty實作通用二進制協定的高效資料傳輸

        }

110

使用Netty實作通用二進制協定的高效資料傳輸

        return params.get(key);

111

使用Netty實作通用二進制協定的高效資料傳輸

    }

112

使用Netty實作通用二進制協定的高效資料傳輸

113

使用Netty實作通用二進制協定的高效資料傳輸

    public String getIp() {

114

使用Netty實作通用二進制協定的高效資料傳輸

        return ip;

115

使用Netty實作通用二進制協定的高效資料傳輸

    }

116

使用Netty實作通用二進制協定的高效資料傳輸

117

使用Netty實作通用二進制協定的高效資料傳輸

    public void setIp(String ip) {

118

使用Netty實作通用二進制協定的高效資料傳輸

        this.ip = ip;

119

使用Netty實作通用二進制協定的高效資料傳輸

    }

120

使用Netty實作通用二進制協定的高效資料傳輸

121

使用Netty實作通用二進制協定的高效資料傳輸

    public void setParams(Map<String, String> params) {

122

使用Netty實作通用二進制協定的高效資料傳輸

        this.params = params;

123

使用Netty實作通用二進制協定的高效資料傳輸

    }

124

使用Netty實作通用二進制協定的高效資料傳輸

125

使用Netty實作通用二進制協定的高效資料傳輸

    @Override

126

使用Netty實作通用二進制協定的高效資料傳輸

    public String toString() {

127

使用Netty實作通用二進制協定的高效資料傳輸

        return "XLRequest [encode=" + encode + ", encrypt=" + encrypt + ", extend1=" + extend1 + ", extend2=" + extend2

128

使用Netty實作通用二進制協定的高效資料傳輸

                + ", sessionid=" + sessionid + ", command=" + command + ", length=" + length + ", params=" + params + ", ip=" + ip + "]";

129

使用Netty實作通用二進制協定的高效資料傳輸

    }

130

使用Netty實作通用二進制協定的高效資料傳輸

}

131

使用Netty實作通用二進制協定的高效資料傳輸

二、协议的编码和解码

对于自定义二进制协议,编码解码器往往是Netty开发的重点。这里直接给出相关类的代码。

 

1

使用Netty實作通用二進制協定的高效資料傳輸

package  org.jboss.netty.example.xlsvr.codec;

2

使用Netty實作通用二進制協定的高效資料傳輸

3

使用Netty實作通用二進制協定的高效資料傳輸

import  java.nio.ByteBuffer;

4

使用Netty實作通用二進制協定的高效資料傳輸

5

使用Netty實作通用二進制協定的高效資料傳輸

import  org.jboss.netty.buffer.ChannelBuffer;

6

使用Netty實作通用二進制協定的高效資料傳輸

import  org.jboss.netty.buffer.ChannelBuffers;

7

使用Netty實作通用二進制協定的高效資料傳輸

import  org.jboss.netty.channel.ChannelHandlerContext;

8

使用Netty實作通用二進制協定的高效資料傳輸

import  org.jboss.netty.channel.Channels;

9

使用Netty實作通用二進制協定的高效資料傳輸

import  org.jboss.netty.channel.MessageEvent;

10

使用Netty實作通用二進制協定的高效資料傳輸

import  org.jboss.netty.channel.SimpleChannelDownstreamHandler;

11

使用Netty實作通用二進制協定的高效資料傳輸

import  org.jboss.netty.example.xlsvr.util.ProtocolUtil;

12

使用Netty實作通用二進制協定的高效資料傳輸

import  org.jboss.netty.example.xlsvr.vo.XLResponse;

13

使用Netty實作通用二進制協定的高效資料傳輸

import  org.slf4j.Logger;

14

使用Netty實作通用二進制協定的高效資料傳輸

import  org.slf4j.LoggerFactory;

15

使用Netty實作通用二進制協定的高效資料傳輸

16

使用Netty實作通用二進制協定的高效資料傳輸

20

使用Netty實作通用二進制協定的高效資料傳輸

21

使用Netty實作通用二進制協定的高效資料傳輸

24

使用Netty實作通用二進制協定的高效資料傳輸

public   class  XLServerEncoder  extends  SimpleChannelDownstreamHandler  {

25

使用Netty實作通用二進制協定的高效資料傳輸

    Logger logger=LoggerFactory.getLogger(XLServerEncoder.class);

26

使用Netty實作通用二進制協定的高效資料傳輸

    

27

使用Netty實作通用二進制協定的高效資料傳輸

    @Override

28

使用Netty實作通用二進制協定的高效資料傳輸

    public void writeRequested(ChannelHandlerContext ctx, MessageEvent e) throws Exception {

29

使用Netty實作通用二進制協定的高效資料傳輸

        XLResponse response=(XLResponse)e.getMessage();

30

使用Netty實作通用二進制協定的高效資料傳輸

        ByteBuffer headBuffer=ByteBuffer.allocate(16);

31

使用Netty實作通用二進制協定的高效資料傳輸

        

34

使用Netty實作通用二進制協定的高效資料傳輸

        headBuffer.put(response.getEncode());

35

使用Netty實作通用二進制協定的高效資料傳輸

        headBuffer.put(response.getEncrypt());

36

使用Netty實作通用二進制協定的高效資料傳輸

        headBuffer.put(response.getExtend1());

37

使用Netty實作通用二進制協定的高效資料傳輸

        headBuffer.put(response.getExtend2());

38

使用Netty實作通用二進制協定的高效資料傳輸

        headBuffer.putInt(response.getSessionid());

39

使用Netty實作通用二進制協定的高效資料傳輸

        headBuffer.putInt(response.getResult());

40

使用Netty實作通用二進制協定的高效資料傳輸

        

41

使用Netty實作通用二進制協定的高效資料傳輸

        

44

使用Netty實作通用二進制協定的高效資料傳輸

        ChannelBuffer dataBuffer=ProtocolUtil.encode(response.getEncode(),response.getValues()); 

45

使用Netty實作通用二進制協定的高效資料傳輸

        int length=dataBuffer.readableBytes();

46

使用Netty實作通用二進制協定的高效資料傳輸

        headBuffer.putInt(length);

47

使用Netty實作通用二進制協定的高效資料傳輸

        

51

使用Netty實作通用二進制協定的高效資料傳輸

        headBuffer.flip();

52

使用Netty實作通用二進制協定的高效資料傳輸

        ChannelBuffer totalBuffer=ChannelBuffers.dynamicBuffer();

53

使用Netty實作通用二進制協定的高效資料傳輸

        totalBuffer.writeBytes(headBuffer);

54

使用Netty實作通用二進制協定的高效資料傳輸

        logger.info("totalBuffer size="+totalBuffer.readableBytes());

55

使用Netty實作通用二進制協定的高效資料傳輸

        totalBuffer.writeBytes(dataBuffer);

56

使用Netty實作通用二進制協定的高效資料傳輸

        logger.info("totalBuffer size="+totalBuffer.readableBytes());

57

使用Netty實作通用二進制協定的高效資料傳輸

        Channels.write(ctx, e.getFuture(), totalBuffer);

58

使用Netty實作通用二進制協定的高效資料傳輸

    }

59

使用Netty實作通用二進制協定的高效資料傳輸

60

使用Netty實作通用二進制協定的高效資料傳輸

}

61

使用Netty實作通用二進制協定的高效資料傳輸

 

1

使用Netty實作通用二進制協定的高效資料傳輸

package  org.jboss.netty.example.xlsvr.codec;

2

使用Netty實作通用二進制協定的高效資料傳輸

3

使用Netty實作通用二進制協定的高效資料傳輸

import  org.jboss.netty.buffer.ChannelBuffer;

4

使用Netty實作通用二進制協定的高效資料傳輸

import  org.jboss.netty.buffer.ChannelBuffers;

5

使用Netty實作通用二進制協定的高效資料傳輸

import  org.jboss.netty.channel.Channel;

6

使用Netty實作通用二進制協定的高效資料傳輸

import  org.jboss.netty.channel.ChannelHandlerContext;

7

使用Netty實作通用二進制協定的高效資料傳輸

import  org.jboss.netty.example.xlsvr.util.ProtocolUtil;

8

使用Netty實作通用二進制協定的高效資料傳輸

import  org.jboss.netty.example.xlsvr.vo.XLResponse;

9

使用Netty實作通用二進制協定的高效資料傳輸

import  org.jboss.netty.handler.codec.frame.FrameDecoder;

10

使用Netty實作通用二進制協定的高效資料傳輸

11

使用Netty實作通用二進制協定的高效資料傳輸

15

使用Netty實作通用二進制協定的高效資料傳輸

16

使用Netty實作通用二進制協定的高效資料傳輸

19

使用Netty實作通用二進制協定的高效資料傳輸

public   class  XLClientDecoder  extends  FrameDecoder  {

20

使用Netty實作通用二進制協定的高效資料傳輸

21

使用Netty實作通用二進制協定的高效資料傳輸

    @Override

22

使用Netty實作通用二進制協定的高效資料傳輸

    protected Object decode(ChannelHandlerContext context, Channel channel, ChannelBuffer buffer) throws Exception {

23

使用Netty實作通用二進制協定的高效資料傳輸

        if (buffer.readableBytes()<16) {

24

使用Netty實作通用二進制協定的高效資料傳輸

            return null;

25

使用Netty實作通用二進制協定的高效資料傳輸

        }

26

使用Netty實作通用二進制協定的高效資料傳輸

        buffer.markReaderIndex();

27

使用Netty實作通用二進制協定的高效資料傳輸

        byte encode=buffer.readByte();

28

使用Netty實作通用二進制協定的高效資料傳輸

        byte encrypt=buffer.readByte();

29

使用Netty實作通用二進制協定的高效資料傳輸

        byte extend1=buffer.readByte();

30

使用Netty實作通用二進制協定的高效資料傳輸

        byte extend2=buffer.readByte();

31

使用Netty實作通用二進制協定的高效資料傳輸

        int sessionid=buffer.readInt();

32

使用Netty實作通用二進制協定的高效資料傳輸

        int result=buffer.readInt();

33

使用Netty實作通用二進制協定的高效資料傳輸

        int length=buffer.readInt(); // 数据包长

34

使用Netty實作通用二進制協定的高效資料傳輸

        if (buffer.readableBytes()<length) {

35

使用Netty實作通用二進制協定的高效資料傳輸

            buffer.resetReaderIndex();

36

使用Netty實作通用二進制協定的高效資料傳輸

            return null;

37

使用Netty實作通用二進制協定的高效資料傳輸

        }

38

使用Netty實作通用二進制協定的高效資料傳輸

        ChannelBuffer dataBuffer=ChannelBuffers.buffer(length);

39

使用Netty實作通用二進制協定的高效資料傳輸

        buffer.readBytes(dataBuffer, length);

40

使用Netty實作通用二進制協定的高效資料傳輸

        

41

使用Netty實作通用二進制協定的高效資料傳輸

        XLResponse response=new XLResponse();

42

使用Netty實作通用二進制協定的高效資料傳輸

        response.setEncode(encode);

43

使用Netty實作通用二進制協定的高效資料傳輸

        response.setEncrypt(encrypt);

44

使用Netty實作通用二進制協定的高效資料傳輸

        response.setExtend1(extend1);

45

使用Netty實作通用二進制協定的高效資料傳輸

        response.setExtend2(extend2);

46

使用Netty實作通用二進制協定的高效資料傳輸

        response.setSessionid(sessionid);

47

使用Netty實作通用二進制協定的高效資料傳輸

        response.setResult(result);

48

使用Netty實作通用二進制協定的高效資料傳輸

        response.setLength(length);

49

使用Netty實作通用二進制協定的高效資料傳輸

        response.setValues(ProtocolUtil.decode(encode, dataBuffer));

50

使用Netty實作通用二進制協定的高效資料傳輸

        response.setIp(ProtocolUtil.getClientIp(channel));

51

使用Netty實作通用二進制協定的高效資料傳輸

        return response;

52

使用Netty實作通用二進制協定的高效資料傳輸

    }

53

使用Netty實作通用二進制協定的高效資料傳輸

54

使用Netty實作通用二進制協定的高效資料傳輸

}

 

  1

使用Netty實作通用二進制協定的高效資料傳輸

package  org.jboss.netty.example.xlsvr.util;

  2

使用Netty實作通用二進制協定的高效資料傳輸

  3

使用Netty實作通用二進制協定的高效資料傳輸

import  java.net.SocketAddress;

  4

使用Netty實作通用二進制協定的高效資料傳輸

import  java.nio.charset.Charset;

  5

使用Netty實作通用二進制協定的高效資料傳輸

import  java.util.HashMap;

  6

使用Netty實作通用二進制協定的高效資料傳輸

import  java.util.Map;

  7

使用Netty實作通用二進制協定的高效資料傳輸

import  java.util.Map.Entry;

  8

使用Netty實作通用二進制協定的高效資料傳輸

  9

使用Netty實作通用二進制協定的高效資料傳輸

import  org.jboss.netty.buffer.ChannelBuffer;

10

使用Netty實作通用二進制協定的高效資料傳輸

import  org.jboss.netty.buffer.ChannelBuffers;

11

使用Netty實作通用二進制協定的高效資料傳輸

import  org.jboss.netty.channel.Channel;

12

使用Netty實作通用二進制協定的高效資料傳輸

13

使用Netty實作通用二進制協定的高效資料傳輸

17

使用Netty實作通用二進制協定的高效資料傳輸

public   class  ProtocolUtil  {

18

使用Netty實作通用二進制協定的高效資料傳輸

    

19

使用Netty實作通用二進制協定的高效資料傳輸

    

25

使用Netty實作通用二進制協定的高效資料傳輸

    public static ChannelBuffer encode(int encode,Map<String,String> values){

26

使用Netty實作通用二進制協定的高效資料傳輸

        ChannelBuffer totalBuffer=null;

27

使用Netty實作通用二進制協定的高效資料傳輸

        if (values!=null && values.size()>0) {

28

使用Netty實作通用二進制協定的高效資料傳輸

            totalBuffer=ChannelBuffers.dynamicBuffer();

29

使用Netty實作通用二進制協定的高效資料傳輸

            int length=0,index=0;

30

使用Netty實作通用二進制協定的高效資料傳輸

            ChannelBuffer [] channelBuffers=new ChannelBuffer[values.size()];

31

使用Netty實作通用二進制協定的高效資料傳輸

            Charset charset=XLCharSetFactory.getCharset(encode);

32

使用Netty實作通用二進制協定的高效資料傳輸

            for(Entry<String,String> entry:values.entrySet()){

33

使用Netty實作通用二進制協定的高效資料傳輸

                String key=entry.getKey();

34

使用Netty實作通用二進制協定的高效資料傳輸

                String value=entry.getValue();

35

使用Netty實作通用二進制協定的高效資料傳輸

                ChannelBuffer buffer=ChannelBuffers.dynamicBuffer();

36

使用Netty實作通用二進制協定的高效資料傳輸

                buffer.writeInt(key.length());

37

使用Netty實作通用二進制協定的高效資料傳輸

                buffer.writeBytes(key.getBytes(charset));

38

使用Netty實作通用二進制協定的高效資料傳輸

                buffer.writeInt(value.length());

39

使用Netty實作通用二進制協定的高效資料傳輸

                buffer.writeBytes(value.getBytes(charset));

40

使用Netty實作通用二進制協定的高效資料傳輸

                channelBuffers[index++]=buffer;

41

使用Netty實作通用二進制協定的高效資料傳輸

                length+=buffer.readableBytes();

42

使用Netty實作通用二進制協定的高效資料傳輸

            }

43

使用Netty實作通用二進制協定的高效資料傳輸

            

44

使用Netty實作通用二進制協定的高效資料傳輸

            for (int i = 0; i < channelBuffers.length; i++) {

45

使用Netty實作通用二進制協定的高效資料傳輸

                totalBuffer.writeBytes(channelBuffers[i]);

46

使用Netty實作通用二進制協定的高效資料傳輸

            }

47

使用Netty實作通用二進制協定的高效資料傳輸

        }

48

使用Netty實作通用二進制協定的高效資料傳輸

        return totalBuffer;

49

使用Netty實作通用二進制協定的高效資料傳輸

    }

50

使用Netty實作通用二進制協定的高效資料傳輸

    

51

使用Netty實作通用二進制協定的高效資料傳輸

    

57

使用Netty實作通用二進制協定的高效資料傳輸

    public static Map<String,String> decode(int encode,ChannelBuffer dataBuffer){

58

使用Netty實作通用二進制協定的高效資料傳輸

        Map<String,String> dataMap=new HashMap<String, String>();

59

使用Netty實作通用二進制協定的高效資料傳輸

        if (dataBuffer!=null && dataBuffer.readableBytes()>0) {

60

使用Netty實作通用二進制協定的高效資料傳輸

            int processIndex=0,length=dataBuffer.readableBytes();

61

使用Netty實作通用二進制協定的高效資料傳輸

            Charset charset=XLCharSetFactory.getCharset(encode);

62

使用Netty實作通用二進制協定的高效資料傳輸

            while(processIndex<length){

63

使用Netty實作通用二進制協定的高效資料傳輸

                

66

使用Netty實作通用二進制協定的高效資料傳輸

                int size=dataBuffer.readInt();

67

使用Netty實作通用二進制協定的高效資料傳輸

                byte [] contents=new byte [size];

68

使用Netty實作通用二進制協定的高效資料傳輸

                dataBuffer.readBytes(contents);

69

使用Netty實作通用二進制協定的高效資料傳輸

                String key=new String(contents, charset);

70

使用Netty實作通用二進制協定的高效資料傳輸

                processIndex=processIndex+size+4;

71

使用Netty實作通用二進制協定的高效資料傳輸

                

74

使用Netty實作通用二進制協定的高效資料傳輸

                size=dataBuffer.readInt();

75

使用Netty實作通用二進制協定的高效資料傳輸

                contents=new byte [size];

76

使用Netty實作通用二進制協定的高效資料傳輸

                dataBuffer.readBytes(contents);

77

使用Netty實作通用二進制協定的高效資料傳輸

                String value=new String(contents, charset);

78

使用Netty實作通用二進制協定的高效資料傳輸

                dataMap.put(key, value);

79

使用Netty實作通用二進制協定的高效資料傳輸

                processIndex=processIndex+size+4;

80

使用Netty實作通用二進制協定的高效資料傳輸

            }

81

使用Netty實作通用二進制協定的高效資料傳輸

        }

82

使用Netty實作通用二進制協定的高效資料傳輸

        return dataMap;

83

使用Netty實作通用二進制協定的高效資料傳輸

    }

84

使用Netty實作通用二進制協定的高效資料傳輸

    

85

使用Netty實作通用二進制協定的高效資料傳輸

    

90

使用Netty實作通用二進制協定的高效資料傳輸

    public static String getClientIp(Channel channel){

91

使用Netty實作通用二進制協定的高效資料傳輸

        

94

使用Netty實作通用二進制協定的高效資料傳輸

        SocketAddress address = channel.getRemoteAddress();

95

使用Netty實作通用二進制協定的高效資料傳輸

        String ip = "";

96

使用Netty實作通用二進制協定的高效資料傳輸

        if (address != null) {

97

使用Netty實作通用二進制協定的高效資料傳輸

            ip = address.toString().trim();

98

使用Netty實作通用二進制協定的高效資料傳輸

            int index = ip.lastIndexOf(':');

99

使用Netty實作通用二進制協定的高效資料傳輸

            if (index < 1) {

100

使用Netty實作通用二進制協定的高效資料傳輸

                index = ip.length();

101

使用Netty實作通用二進制協定的高效資料傳輸

            }

102

使用Netty實作通用二進制協定的高效資料傳輸

            ip = ip.substring(1, index);

103

使用Netty實作通用二進制協定的高效資料傳輸

        }

104

使用Netty實作通用二進制協定的高效資料傳輸

        if (ip.length() > 15) {

105

使用Netty實作通用二進制協定的高效資料傳輸

            ip = ip.substring(Math.max(ip.indexOf("/") + 1, ip.length() - 15));

106

使用Netty實作通用二進制協定的高效資料傳輸

        }

107

使用Netty實作通用二進制協定的高效資料傳輸

        return ip;

108

使用Netty實作通用二進制協定的高效資料傳輸

    }

109

使用Netty實作通用二進制協定的高效資料傳輸

}

110

使用Netty實作通用二進制協定的高效資料傳輸

三、服务器端实现

服务器端提供的功能是:

1、接收客户端的请求(非关闭命令),返回XLResponse类型的数据。

2、如果客户端的请求是关闭命令:shutdown,则服务器端关闭自身进程。

为了展示多协议的运用,这里客户端的请求采用的是基于问本行(\n\r)的协议。

具体代码如下:

1

使用Netty實作通用二進制協定的高效資料傳輸

package  org.jboss.netty.example.xlsvr;

2

使用Netty實作通用二進制協定的高效資料傳輸

3

使用Netty實作通用二進制協定的高效資料傳輸

import  java.net.InetSocketAddress;

4

使用Netty實作通用二進制協定的高效資料傳輸

import  java.util.concurrent.Executors;

5

使用Netty實作通用二進制協定的高效資料傳輸

6

使用Netty實作通用二進制協定的高效資料傳輸

import  org.jboss.netty.bootstrap.ServerBootstrap;

7

使用Netty實作通用二進制協定的高效資料傳輸

import  org.jboss.netty.channel.Channel;

8

使用Netty實作通用二進制協定的高效資料傳輸

import  org.jboss.netty.channel.ChannelPipeline;

9

使用Netty實作通用二進制協定的高效資料傳輸

import  org.jboss.netty.channel.group.ChannelGroup;

10

使用Netty實作通用二進制協定的高效資料傳輸

import  org.jboss.netty.channel.group.ChannelGroupFuture;

11

使用Netty實作通用二進制協定的高效資料傳輸

import  org.jboss.netty.channel.group.DefaultChannelGroup;

12

使用Netty實作通用二進制協定的高效資料傳輸

import  org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;

13

使用Netty實作通用二進制協定的高效資料傳輸

import  org.jboss.netty.example.xlsvr.codec.XLServerEncoder;

14

使用Netty實作通用二進制協定的高效資料傳輸

import  org.jboss.netty.handler.codec.frame.DelimiterBasedFrameDecoder;

15

使用Netty實作通用二進制協定的高效資料傳輸

import  org.jboss.netty.handler.codec.frame.Delimiters;

16

使用Netty實作通用二進制協定的高效資料傳輸

import  org.jboss.netty.handler.codec.string.StringDecoder;

17

使用Netty實作通用二進制協定的高效資料傳輸

import  org.jboss.netty.util.CharsetUtil;

18

使用Netty實作通用二進制協定的高效資料傳輸

import  org.slf4j.Logger;

19

使用Netty實作通用二進制協定的高效資料傳輸

import  org.slf4j.LoggerFactory;

20

使用Netty實作通用二進制協定的高效資料傳輸

21

使用Netty實作通用二進制協定的高效資料傳輸

25

使用Netty實作通用二進制協定的高效資料傳輸

26

使用Netty實作通用二進制協定的高效資料傳輸

public   class  XLServer  {

27

使用Netty實作通用二進制協定的高效資料傳輸

    public static final int port =8080;

28

使用Netty實作通用二進制協定的高效資料傳輸

    public static final Logger logger=LoggerFactory.getLogger(XLServer.class);

29

使用Netty實作通用二進制協定的高效資料傳輸

    public static final ChannelGroup allChannels=new DefaultChannelGroup("XLServer");

30

使用Netty實作通用二進制協定的高效資料傳輸

    private static final ServerBootstrap serverBootstrap=new ServerBootstrap(new NioServerSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool()));

31

使用Netty實作通用二進制協定的高效資料傳輸

    

32

使用Netty實作通用二進制協定的高效資料傳輸

    public static void main(String [] args){

33

使用Netty實作通用二進制協定的高效資料傳輸

        try {

34

使用Netty實作通用二進制協定的高效資料傳輸

            XLServer.startup();

35

使用Netty實作通用二進制協定的高效資料傳輸

        } catch (Exception e) {

36

使用Netty實作通用二進制協定的高效資料傳輸

            e.printStackTrace();

37

使用Netty實作通用二進制協定的高效資料傳輸

        }

38

使用Netty實作通用二進制協定的高效資料傳輸

    }

39

使用Netty實作通用二進制協定的高效資料傳輸

    

40

使用Netty實作通用二進制協定的高效資料傳輸

    public static boolean startup() throws Exception{

41

使用Netty實作通用二進制協定的高效資料傳輸

        

46

使用Netty實作通用二進制協定的高效資料傳輸

        ChannelPipeline pipeline=serverBootstrap.getPipeline(); 

47

使用Netty實作通用二進制協定的高效資料傳輸

        

50

使用Netty實作通用二進制協定的高效資料傳輸

        pipeline.addLast("frameDecoder", new DelimiterBasedFrameDecoder(80, Delimiters.lineDelimiter()));

51

使用Netty實作通用二進制協定的高效資料傳輸

        pipeline.addLast("stringDecoder", new StringDecoder(CharsetUtil.UTF_8));

52

使用Netty實作通用二進制協定的高效資料傳輸

        pipeline.addLast("encoder", new XLServerEncoder());

53

使用Netty實作通用二進制協定的高效資料傳輸

        pipeline.addLast("handler", new XLServerHandler());

54

使用Netty實作通用二進制協定的高效資料傳輸

        

55

使用Netty實作通用二進制協定的高效資料傳輸

        serverBootstrap.setOption("child.tcpNoDelay", true); //注意child前缀

56

使用Netty實作通用二進制協定的高效資料傳輸

        serverBootstrap.setOption("child.keepAlive", true); //注意child前缀

57

使用Netty實作通用二進制協定的高效資料傳輸

        

58

使用Netty實作通用二進制協定的高效資料傳輸

        

61

使用Netty實作通用二進制協定的高效資料傳輸

        Channel channel=serverBootstrap.bind(new InetSocketAddress(port));

62

使用Netty實作通用二進制協定的高效資料傳輸

        allChannels.add(channel);

63

使用Netty實作通用二進制協定的高效資料傳輸

        logger.info("server is started on port "+port);

64

使用Netty實作通用二進制協定的高效資料傳輸

        return false;

65

使用Netty實作通用二進制協定的高效資料傳輸

    }

66

使用Netty實作通用二進制協定的高效資料傳輸

    

67

使用Netty實作通用二進制協定的高效資料傳輸

    public static void shutdown() throws Exception{

68

使用Netty實作通用二進制協定的高效資料傳輸

        try {

69

使用Netty實作通用二進制協定的高效資料傳輸

            

72

使用Netty實作通用二進制協定的高效資料傳輸

            ChannelGroupFuture future=allChannels.close();

73

使用Netty實作通用二進制協定的高效資料傳輸

            future.awaitUninterruptibly();//阻塞,直到服务器关闭

74

使用Netty實作通用二進制協定的高效資料傳輸

            //serverBootstrap.releaseExternalResources();

75

使用Netty實作通用二進制協定的高效資料傳輸

        } catch (Exception e) {

76

使用Netty實作通用二進制協定的高效資料傳輸

            e.printStackTrace();

77

使用Netty實作通用二進制協定的高效資料傳輸

            logger.error(e.getMessage(),e);

78

使用Netty實作通用二進制協定的高效資料傳輸

        }

79

使用Netty實作通用二進制協定的高效資料傳輸

        finally{

80

使用Netty實作通用二進制協定的高效資料傳輸

            logger.info("server is shutdown on port "+port);

81

使用Netty實作通用二進制協定的高效資料傳輸

            System.exit(1);

82

使用Netty實作通用二進制協定的高效資料傳輸

        }

83

使用Netty實作通用二進制協定的高效資料傳輸

    }

84

使用Netty實作通用二進制協定的高效資料傳輸

}

85

使用Netty實作通用二進制協定的高效資料傳輸

 

  1

使用Netty實作通用二進制協定的高效資料傳輸

package  org.jboss.netty.example.xlsvr;

  2

使用Netty實作通用二進制協定的高效資料傳輸

  3

使用Netty實作通用二進制協定的高效資料傳輸

import  java.util.Random;

  4

使用Netty實作通用二進制協定的高效資料傳輸

  5

使用Netty實作通用二進制協定的高效資料傳輸

import  org.jboss.netty.channel.Channel;

  6

使用Netty實作通用二進制協定的高效資料傳輸

import  org.jboss.netty.channel.ChannelFuture;

  7

使用Netty實作通用二進制協定的高效資料傳輸

import  org.jboss.netty.channel.ChannelHandlerContext;

  8

使用Netty實作通用二進制協定的高效資料傳輸

import  org.jboss.netty.channel.ChannelHandler.Sharable;

  9

使用Netty實作通用二進制協定的高效資料傳輸

import  org.jboss.netty.channel.ChannelStateEvent;

10

使用Netty實作通用二進制協定的高效資料傳輸

import  org.jboss.netty.channel.ExceptionEvent;

11

使用Netty實作通用二進制協定的高效資料傳輸

import  org.jboss.netty.channel.MessageEvent;

12

使用Netty實作通用二進制協定的高效資料傳輸

import  org.jboss.netty.channel.SimpleChannelHandler;

13

使用Netty實作通用二進制協定的高效資料傳輸

import  org.jboss.netty.example.xlsvr.vo.XLResponse;

14

使用Netty實作通用二進制協定的高效資料傳輸

import  org.slf4j.Logger;

15

使用Netty實作通用二進制協定的高效資料傳輸

import  org.slf4j.LoggerFactory;

16

使用Netty實作通用二進制協定的高效資料傳輸

17

使用Netty實作通用二進制協定的高效資料傳輸

21

使用Netty實作通用二進制協定的高效資料傳輸

22

使用Netty實作通用二進制協定的高效資料傳輸

@Sharable

23

使用Netty實作通用二進制協定的高效資料傳輸

public   class  XLServerHandler  extends  SimpleChannelHandler  {

24

使用Netty實作通用二進制協定的高效資料傳輸

    private static final Logger logger=LoggerFactory.getLogger(XLServerHandler.class);

25

使用Netty實作通用二進制協定的高效資料傳輸

    

26

使用Netty實作通用二進制協定的高效資料傳輸

    @Override

27

使用Netty實作通用二進制協定的高效資料傳輸

    public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {

28

使用Netty實作通用二進制協定的高效資料傳輸

        logger.info("messageReceived");

29

使用Netty實作通用二進制協定的高效資料傳輸

        if (e.getMessage() instanceof String) {

30

使用Netty實作通用二進制協定的高效資料傳輸

            String content=(String)e.getMessage();

31

使用Netty實作通用二進制協定的高效資料傳輸

            logger.info("content is "+content);

32

使用Netty實作通用二進制協定的高效資料傳輸

            if ("shutdown".equalsIgnoreCase(content)) {

33

使用Netty實作通用二進制協定的高效資料傳輸

                //e.getChannel().close();

34

使用Netty實作通用二進制協定的高效資料傳輸

                XLServer.shutdown();

35

使用Netty實作通用二進制協定的高效資料傳輸

            }else {

36

使用Netty實作通用二進制協定的高效資料傳輸

                sendResponse(ctx);

37

使用Netty實作通用二進制協定的高效資料傳輸

            }

38

使用Netty實作通用二進制協定的高效資料傳輸

        }else {

39

使用Netty實作通用二進制協定的高效資料傳輸

            logger.error("message is not a String.");

40

使用Netty實作通用二進制協定的高效資料傳輸

            e.getChannel().close();

41

使用Netty實作通用二進制協定的高效資料傳輸

        }

42

使用Netty實作通用二進制協定的高效資料傳輸

    }

43

使用Netty實作通用二進制協定的高效資料傳輸

44

使用Netty實作通用二進制協定的高效資料傳輸

    @Override

45

使用Netty實作通用二進制協定的高效資料傳輸

    public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception {

46

使用Netty實作通用二進制協定的高效資料傳輸

        logger.error(e.getCause().getMessage(),e.getCause());

47

使用Netty實作通用二進制協定的高效資料傳輸

        e.getCause().printStackTrace();

48

使用Netty實作通用二進制協定的高效資料傳輸

        e.getChannel().close();

49

使用Netty實作通用二進制協定的高效資料傳輸

    }

50

使用Netty實作通用二進制協定的高效資料傳輸

51

使用Netty實作通用二進制協定的高效資料傳輸

    @Override

52

使用Netty實作通用二進制協定的高效資料傳輸

    public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {

53

使用Netty實作通用二進制協定的高效資料傳輸

        logger.info("channelConnected");

54

使用Netty實作通用二進制協定的高效資料傳輸

        sendResponse(ctx);

55

使用Netty實作通用二進制協定的高效資料傳輸

    }

56

使用Netty實作通用二進制協定的高效資料傳輸

57

使用Netty實作通用二進制協定的高效資料傳輸

    @Override

58

使用Netty實作通用二進制協定的高效資料傳輸

    public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {

59

使用Netty實作通用二進制協定的高效資料傳輸

        logger.info("channelClosed");

60

使用Netty實作通用二進制協定的高效資料傳輸

        //删除通道

61

使用Netty實作通用二進制協定的高效資料傳輸

        XLServer.allChannels.remove(e.getChannel());

62

使用Netty實作通用二進制協定的高效資料傳輸

    }

63

使用Netty實作通用二進制協定的高效資料傳輸

64

使用Netty實作通用二進制協定的高效資料傳輸

    @Override

65

使用Netty實作通用二進制協定的高效資料傳輸

    public void channelDisconnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {

66

使用Netty實作通用二進制協定的高效資料傳輸

        logger.info("channelDisconnected");

67

使用Netty實作通用二進制協定的高效資料傳輸

        super.channelDisconnected(ctx, e);

68

使用Netty實作通用二進制協定的高效資料傳輸

    }

69

使用Netty實作通用二進制協定的高效資料傳輸

70

使用Netty實作通用二進制協定的高效資料傳輸

    @Override

71

使用Netty實作通用二進制協定的高效資料傳輸

    public void channelOpen(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {

72

使用Netty實作通用二進制協定的高效資料傳輸

        logger.info("channelOpen");

73

使用Netty實作通用二進制協定的高效資料傳輸

        //增加通道

74

使用Netty實作通用二進制協定的高效資料傳輸

        XLServer.allChannels.add(e.getChannel());

75

使用Netty實作通用二進制協定的高效資料傳輸

    }

76

使用Netty實作通用二進制協定的高效資料傳輸

77

使用Netty實作通用二進制協定的高效資料傳輸

    

83

使用Netty實作通用二進制協定的高效資料傳輸

    private ChannelFuture sendResponse(ChannelHandlerContext ctx){

84

使用Netty實作通用二進制協定的高效資料傳輸

        Channel channel=ctx.getChannel();

85

使用Netty實作通用二進制協定的高效資料傳輸

        Random random=new Random();

86

使用Netty實作通用二進制協定的高效資料傳輸

        XLResponse response=new XLResponse();

87

使用Netty實作通用二進制協定的高效資料傳輸

        response.setEncode((byte)0);

88

使用Netty實作通用二進制協定的高效資料傳輸

        response.setResult(1);

89

使用Netty實作通用二進制協定的高效資料傳輸

        response.setValue("name","hankchen");

90

使用Netty實作通用二進制協定的高效資料傳輸

        response.setValue("time", String.valueOf(System.currentTimeMillis()));

91

使用Netty實作通用二進制協定的高效資料傳輸

        response.setValue("age",String.valueOf(random.nextInt()));

92

使用Netty實作通用二進制協定的高效資料傳輸

        

96

使用Netty實作通用二進制協定的高效資料傳輸

        ChannelFuture future=channel.write(response); //发送内容

97

使用Netty實作通用二進制協定的高效資料傳輸

        return future;

98

使用Netty實作通用二進制協定的高效資料傳輸

    }

99

使用Netty實作通用二進制協定的高效資料傳輸

}

100

使用Netty實作通用二進制協定的高效資料傳輸

四、客户端实现

客户端的功能是连接服务器,发送10次请求,然后发送关闭服务器的命令,最后主动关闭客户端。

关键代码如下:

1

使用Netty實作通用二進制協定的高效資料傳輸

6

使用Netty實作通用二進制協定的高效資料傳輸

7

使用Netty實作通用二進制協定的高效資料傳輸

12

使用Netty實作通用二進制協定的高效資料傳輸

public   class  XLClient  {

13

使用Netty實作通用二進制協定的高效資料傳輸

    public static final int port =XLServer.port;

14

使用Netty實作通用二進制協定的高效資料傳輸

    public static final String host ="localhost";

15

使用Netty實作通用二進制協定的高效資料傳輸

    private static final Logger logger=LoggerFactory.getLogger(XLClient.class);

16

使用Netty實作通用二進制協定的高效資料傳輸

    private static final NioClientSocketChannelFactory clientSocketChannelFactory=new NioClientSocketChannelFactory(Executors.newCachedThreadPool(),Executors.newCachedThreadPool());

17

使用Netty實作通用二進制協定的高效資料傳輸

    private static final ClientBootstrap clientBootstrap=new ClientBootstrap(clientSocketChannelFactory);

18

使用Netty實作通用二進制協定的高效資料傳輸

    

19

使用Netty實作通用二進制協定的高效資料傳輸

    

23

使用Netty實作通用二進制協定的高效資料傳輸

    public static void main(String[] args) throws Exception {

24

使用Netty實作通用二進制協定的高效資料傳輸

        ChannelFuture future=XLClient.startup();

25

使用Netty實作通用二進制協定的高效資料傳輸

        logger.info("future state is "+future.isSuccess());

26

使用Netty實作通用二進制協定的高效資料傳輸

    }

27

使用Netty實作通用二進制協定的高效資料傳輸

    

28

使用Netty實作通用二進制協定的高效資料傳輸

    

33

使用Netty實作通用二進制協定的高效資料傳輸

    public static ChannelFuture startup() throws Exception {

34

使用Netty實作通用二進制協定的高效資料傳輸

        

40

使用Netty實作通用二進制協定的高效資料傳輸

        clientBootstrap.setPipelineFactory(new XLClientPipelineFactory()); //只能这样设置

41

使用Netty實作通用二進制協定的高效資料傳輸

        

44

使用Netty實作通用二進制協定的高效資料傳輸

        clientBootstrap.setOption("tcpNoDelay", true);

45

使用Netty實作通用二進制協定的高效資料傳輸

        clientBootstrap.setOption("keepAlive", true);

46

使用Netty實作通用二進制協定的高效資料傳輸

        

47

使用Netty實作通用二進制協定的高效資料傳輸

        ChannelFuture future=clientBootstrap.connect(new InetSocketAddress(host, port));

48

使用Netty實作通用二進制協定的高效資料傳輸

        

51

使用Netty實作通用二進制協定的高效資料傳輸

        future.awaitUninterruptibly();

52

使用Netty實作通用二進制協定的高效資料傳輸

        

56

使用Netty實作通用二進制協定的高效資料傳輸

        if (!future.isSuccess()) {

57

使用Netty實作通用二進制協定的高效資料傳輸

            future.getCause().printStackTrace();

58

使用Netty實作通用二進制協定的高效資料傳輸

        }else {

59

使用Netty實作通用二進制協定的高效資料傳輸

            logger.info("client is connected to server "+host+":"+port);

60

使用Netty實作通用二進制協定的高效資料傳輸

        }

61

使用Netty實作通用二進制協定的高效資料傳輸

        return future;

62

使用Netty實作通用二進制協定的高效資料傳輸

    }

63

使用Netty實作通用二進制協定的高效資料傳輸

    

64

使用Netty實作通用二進制協定的高效資料傳輸

    

69

使用Netty實作通用二進制協定的高效資料傳輸

    public static void shutdown(ChannelFuture future) throws Exception{

70

使用Netty實作通用二進制協定的高效資料傳輸

        try {

71

使用Netty實作通用二進制協定的高效資料傳輸

            

74

使用Netty實作通用二進制協定的高效資料傳輸

            future.getChannel().close().awaitUninterruptibly();

75

使用Netty實作通用二進制協定的高效資料傳輸

            //future.getChannel().getCloseFuture().awaitUninterruptibly();

76

使用Netty實作通用二進制協定的高效資料傳輸

            

81

使用Netty實作通用二進制協定的高效資料傳輸

            clientBootstrap.releaseExternalResources();

82

使用Netty實作通用二進制協定的高效資料傳輸

        } catch (Exception e) {

83

使用Netty實作通用二進制協定的高效資料傳輸

            e.printStackTrace();

84

使用Netty實作通用二進制協定的高效資料傳輸

            logger.error(e.getMessage(),e);

85

使用Netty實作通用二進制協定的高效資料傳輸

        }

86

使用Netty實作通用二進制協定的高效資料傳輸

        finally{

87

使用Netty實作通用二進制協定的高效資料傳輸

            System.exit(1);

88

使用Netty實作通用二進制協定的高效資料傳輸

            logger.info("client is shutdown to server "+host+":"+port);

89

使用Netty實作通用二進制協定的高效資料傳輸

        }

90

使用Netty實作通用二進制協定的高效資料傳輸

    }

91

使用Netty實作通用二進制協定的高效資料傳輸

}

 

1

使用Netty實作通用二進制協定的高效資料傳輸

public   class  XLClientPipelineFactory  implements  ChannelPipelineFactory {

2

使用Netty實作通用二進制協定的高效資料傳輸

3

使用Netty實作通用二進制協定的高效資料傳輸

    @Override

4

使用Netty實作通用二進制協定的高效資料傳輸

    public ChannelPipeline getPipeline() throws Exception {

5

使用Netty實作通用二進制協定的高效資料傳輸

        ChannelPipeline pipeline=Channels.pipeline();

6

使用Netty實作通用二進制協定的高效資料傳輸

        

10

使用Netty實作通用二進制協定的高效資料傳輸

        pipeline.addLast("decoder", new XLClientDecoder());

11

使用Netty實作通用二進制協定的高效資料傳輸

        

14

使用Netty實作通用二進制協定的高效資料傳輸

        pipeline.addLast("handler", new XLClientHandler());

15

使用Netty實作通用二進制協定的高效資料傳輸

        return pipeline;

16

使用Netty實作通用二進制協定的高效資料傳輸

    }

17

使用Netty實作通用二進制協定的高效資料傳輸

18

使用Netty實作通用二進制協定的高效資料傳輸

}

 

1

使用Netty實作通用二進制協定的高效資料傳輸

6

使用Netty實作通用二進制協定的高效資料傳輸

7

使用Netty實作通用二進制協定的高效資料傳輸

12

使用Netty實作通用二進制協定的高效資料傳輸

public   class  XLClientHandler  extends  SimpleChannelHandler  {

13

使用Netty實作通用二進制協定的高效資料傳輸

    private static final Logger logger=LoggerFactory.getLogger(XLClientHandler.class);

14

使用Netty實作通用二進制協定的高效資料傳輸

    private final AtomicInteger count=new AtomicInteger(0); //计数器

15

使用Netty實作通用二進制協定的高效資料傳輸

    

16

使用Netty實作通用二進制協定的高效資料傳輸

    @Override

17

使用Netty實作通用二進制協定的高效資料傳輸

    public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {

18

使用Netty實作通用二進制協定的高效資料傳輸

        processMethod1(ctx, e); //处理方式一

19

使用Netty實作通用二進制協定的高效資料傳輸

    }

20

使用Netty實作通用二進制協定的高效資料傳輸

    

21

使用Netty實作通用二進制協定的高效資料傳輸

    

26

使用Netty實作通用二進制協定的高效資料傳輸

    public void processMethod1(ChannelHandlerContext ctx, MessageEvent e) throws Exception{

27

使用Netty實作通用二進制協定的高效資料傳輸

        logger.info("processMethod1……,count="+count.addAndGet(1));

28

使用Netty實作通用二進制協定的高效資料傳輸

        XLResponse serverTime=(XLResponse)e.getMessage();

29

使用Netty實作通用二進制協定的高效資料傳輸

        logger.info("messageReceived,content:"+serverTime.toString());

30

使用Netty實作通用二進制協定的高效資料傳輸

        Thread.sleep(1000);

31

使用Netty實作通用二進制協定的高效資料傳輸

        

32

使用Netty實作通用二進制協定的高效資料傳輸

        if (count.get()<10) {

33

使用Netty實作通用二進制協定的高效資料傳輸

            //从新发送请求获取最新的服务器时间

34

使用Netty實作通用二進制協定的高效資料傳輸

            ctx.getChannel().write(ChannelBuffers.wrappedBuffer("again\r\n".getBytes()));

35

使用Netty實作通用二進制協定的高效資料傳輸

        }else{

36

使用Netty實作通用二進制協定的高效資料傳輸

            //从新发送请求关闭服务器

37

使用Netty實作通用二進制協定的高效資料傳輸

            ctx.getChannel().write(ChannelBuffers.wrappedBuffer("shutdown\r\n".getBytes()));

38

使用Netty實作通用二進制協定的高效資料傳輸

        }

39

使用Netty實作通用二進制協定的高效資料傳輸

    }

40

使用Netty實作通用二進制協定的高效資料傳輸

    

41

使用Netty實作通用二進制協定的高效資料傳輸

    @Override

42

使用Netty實作通用二進制協定的高效資料傳輸

    public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception {

43

使用Netty實作通用二進制協定的高效資料傳輸

        logger.info("exceptionCaught");

44

使用Netty實作通用二進制協定的高效資料傳輸

        e.getCause().printStackTrace();

45

使用Netty實作通用二進制協定的高效資料傳輸

        ctx.getChannel().close();

46

使用Netty實作通用二進制協定的高效資料傳輸

    }

47

使用Netty實作通用二進制協定的高效資料傳輸

48

使用Netty實作通用二進制協定的高效資料傳輸

    @Override

49

使用Netty實作通用二進制協定的高效資料傳輸

    public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {

50

使用Netty實作通用二進制協定的高效資料傳輸

        logger.info("channelClosed");

51

使用Netty實作通用二進制協定的高效資料傳輸

        super.channelClosed(ctx, e);

52

使用Netty實作通用二進制協定的高效資料傳輸

    }

53

使用Netty實作通用二進制協定的高效資料傳輸

    

54

使用Netty實作通用二進制協定的高效資料傳輸

    

55

使用Netty實作通用二進制協定的高效資料傳輸

}

全文代码较多,写了很多注释,希望对读者有用,谢谢!

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