Blame view

common/components/pbsplitter.go 2.82 KB
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
  }