0e5d52de
zhangqijia
reactor: 重构底层框架1.0
|
1
2
3
4
5
6
7
8
9
10
|
package components
import (
"bytes"
"encoding/binary"
"fmt"
"pro2d/common"
)
type PBHead struct {
|
b499527e
zhangqijia
feat: 消息包用aes加密
|
11
12
13
|
Length uint32
Cmd uint32
ErrCode int32
|
8568cf44
zhangqijia
update preserve
|
14
|
PreField uint32 // 预留字段 客户端上传的session。echo回去。
|
0e5d52de
zhangqijia
reactor: 重构底层框架1.0
|
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
}
func (h *PBHead) GetDataLen() uint32 {
return h.Length
}
func (h *PBHead) GetMsgID() uint32 {
return h.Cmd
}
func (h *PBHead) GetErrCode() int32 {
return h.ErrCode
}
func (h *PBHead) GetPreserve() uint32 {
return h.PreField
}
type PBMessage struct {
IMessage
Head IHead
Body []byte
|
eadc9aff
zhangqijia
feat: 增加上阵下阵协议,增加...
|
38
|
ID uint32
|
0e5d52de
zhangqijia
reactor: 重构底层框架1.0
|
39
40
|
}
|
0e5d52de
zhangqijia
reactor: 重构底层框架1.0
|
41
42
43
44
|
func (m *PBMessage) GetHeader() IHead {
return m.Head
}
|
b499527e
zhangqijia
feat: 消息包用aes加密
|
45
|
func (m *PBMessage) SetHeader(header IHead) {
|
0e5d52de
zhangqijia
reactor: 重构底层框架1.0
|
46
47
48
49
50
51
52
53
54
55
|
m.Head = header
}
func (m *PBMessage) GetData() []byte {
return m.Body
}
func (m *PBMessage) SetData(b []byte) {
m.Body = b
}
|
eadc9aff
zhangqijia
feat: 增加上阵下阵协议,增加...
|
56
57
|
func (m *PBMessage) SetSID(id uint32) {
m.ID = id
|
0e5d52de
zhangqijia
reactor: 重构底层框架1.0
|
58
59
|
}
|
eadc9aff
zhangqijia
feat: 增加上阵下阵协议,增加...
|
60
61
|
func (m *PBMessage) GetSID() uint32 {
return m.ID
|
0e5d52de
zhangqijia
reactor: 重构底层框架1.0
|
62
63
|
}
|
b499527e
zhangqijia
feat: 消息包用aes加密
|
64
65
66
|
type PBSplitter struct {
encipher IEncipher
}
|
0e5d52de
zhangqijia
reactor: 重构底层框架1.0
|
67
|
|
b499527e
zhangqijia
feat: 消息包用aes加密
|
68
69
70
71
|
func NewPBSplitter(encipher IEncipher) ISplitter {
return &PBSplitter{
encipher,
}
|
0e5d52de
zhangqijia
reactor: 重构底层框架1.0
|
72
73
74
75
76
77
|
}
func (m *PBSplitter) GetHeadLen() uint32 {
return uint32(binary.Size(PBHead{}))
}
|
b499527e
zhangqijia
feat: 消息包用aes加密
|
78
|
func (m *PBSplitter) ParseMsg(data []byte, atEOF bool) (advance int, token []byte, err error) {
|
0e5d52de
zhangqijia
reactor: 重构底层框架1.0
|
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
// 表示我们已经扫描到结尾了
if atEOF && len(data) == 0 {
return 0, nil, nil
}
if !atEOF && len(data) >= int(m.GetHeadLen()) { //4字节数据包长度 4字节指令
length := int32(0)
binary.Read(bytes.NewReader(data[0:4]), binary.BigEndian, &length)
if length <= 0 {
return 0, nil, fmt.Errorf("length is 0")
}
if length > common.MaxPacketLength {
return 0, nil, fmt.Errorf("length exceeds maximum length")
}
if int(length) <= len(data) {
|
b499527e
zhangqijia
feat: 消息包用aes加密
|
94
|
return int(length), data[:int(length)], nil
|
0e5d52de
zhangqijia
reactor: 重构底层框架1.0
|
95
|
}
|
b499527e
zhangqijia
feat: 消息包用aes加密
|
96
|
return 0, nil, nil
|
0e5d52de
zhangqijia
reactor: 重构底层框架1.0
|
97
98
99
100
101
102
103
104
105
106
|
}
if atEOF {
return len(data), data, nil
}
return 0, nil, nil
}
func (m *PBSplitter) Pack(cmd uint32, data []byte, errcode int32, preserve uint32) ([]byte, error) {
buf := &bytes.Buffer{}
h := &PBHead{
|
b499527e
zhangqijia
feat: 消息包用aes加密
|
107
|
Length: m.GetHeadLen(),
|
0e5d52de
zhangqijia
reactor: 重构底层框架1.0
|
108
109
110
111
|
Cmd: cmd,
ErrCode: errcode,
PreField: preserve,
}
|
b499527e
zhangqijia
feat: 消息包用aes加密
|
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
var dataEn []byte
var err error
if m.encipher != nil {
dataEn, err = m.encipher.Encrypt(data)
if err != nil {
return nil, err
}
} else {
dataEn = data
}
h.Length += uint32(len(dataEn))
err = binary.Write(buf, binary.BigEndian, h)
|
0e5d52de
zhangqijia
reactor: 重构底层框架1.0
|
126
127
128
129
|
if err != nil {
return nil, err
}
|
b499527e
zhangqijia
feat: 消息包用aes加密
|
130
|
err = binary.Write(buf, binary.BigEndian, dataEn)
|
0e5d52de
zhangqijia
reactor: 重构底层框架1.0
|
131
132
133
134
135
|
if err != nil {
return nil, err
}
return buf.Bytes(), nil
|
b499527e
zhangqijia
feat: 消息包用aes加密
|
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
|
}
func (m *PBSplitter) UnPack(data []byte) (IMessage, error) {
h := &PBHead{}
err := binary.Read(bytes.NewReader(data), binary.BigEndian, h)
if err != nil {
return nil, err
}
var dataDe []byte
if m.encipher != nil {
dataDe, err = m.encipher.Decrypt(data[m.GetHeadLen():])
if err != nil {
return nil, err
}
} else {
dataDe = data[m.GetHeadLen():]
}
return &PBMessage{
Head: h,
Body: dataDe,
}, nil
}
|