forked from fuyao-w/papillon
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathnet_protocol.go
65 lines (54 loc) · 1.52 KB
/
net_protocol.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package papillon
import (
"bufio"
"encoding/binary"
"errors"
"io"
)
/*
协议:${魔数 1byte} ${请求类型 1 byte} ${请求包体长度 8 byte [BigEndian]} ${请求包体}
*/
const (
magic byte = 3
)
var (
errUnrecognizedRequest = errors.New("unrecognized request")
)
type DefaultPackageParser struct{}
var defaultPackageParser = new(DefaultPackageParser)
func (d *DefaultPackageParser) Encode(writer *bufio.Writer, rpcType rpcType, data []byte) (err error) {
for _, f := range []func() error{
func() error { return writer.WriteByte(magic) }, // magic
func() error { return writer.WriteByte(byte(rpcType)) }, // 命令类型
func() error { return binary.Write(writer, binary.BigEndian, uint64(len(data))) }, // 包体长度
func() error { _, e := writer.Write(data); return e }, // 包体
} {
if err = f(); err != nil {
return
}
}
return err
}
func (d *DefaultPackageParser) Decode(reader *bufio.Reader) (rpcType, []byte, error) {
_magic, err := reader.ReadByte()
if err != nil {
return 0, nil, err
}
if _magic != magic {
return 0, nil, errUnrecognizedRequest
}
// 获取命令类型
rt, err := reader.ReadByte()
if err != nil {
return 0, nil, err
}
// 获取包体长度
var pkgLength uint64
if err = binary.Read(reader, binary.BigEndian, &pkgLength); err != nil {
return 0, nil, err
}
// 获取包体
req := make([]byte, pkgLength)
_, err = io.ReadFull(reader, req)
return rpcType(rt), req, err
}