-
Notifications
You must be signed in to change notification settings - Fork 0
/
msgcodec.go
84 lines (61 loc) · 1.76 KB
/
msgcodec.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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package codec
import (
"github.com/fangjie-luoxi/cellnet"
)
// 编码消息, 在使用了带内存池的codec中,可以传入session或peer的ContextSet,保存内存池上下文,默认ctx传nil
func EncodeMessage(msg interface{}, ctx cellnet.ContextSet) (data []byte, meta *cellnet.MessageMeta, err error) {
// 获取消息元信息
meta = cellnet.MessageMetaByMsg(msg)
if meta == nil {
return nil, nil, cellnet.NewErrorContext("msg not exists", msg)
}
// 将消息编码为字节数组
var raw interface{}
raw, err = meta.Codec.Encode(msg, ctx)
if err != nil {
return
}
data = raw.([]byte)
return
}
// 解码消息
func DecodeMessage(msgid int, data []byte) (interface{}, *cellnet.MessageMeta, error) {
// 获取消息元信息
meta := cellnet.MessageMetaByID(msgid)
// 消息没有注册
if meta == nil {
return nil, nil, cellnet.NewErrorContext("msg not exists", msgid)
}
// 创建消息
msg := meta.NewType()
// 从字节数组转换为消息
err := meta.Codec.Decode(data, msg)
if err != nil {
return nil, meta, err
}
return msg, meta, nil
}
func DecodeMessageByType(data []byte, msg interface{}) (*cellnet.MessageMeta, error) {
meta := cellnet.MessageMetaByMsg(msg)
// 消息没有注册
if meta == nil {
return nil, cellnet.NewErrorContext("msg not exists", nil)
}
err := meta.Codec.Decode(data, msg)
if err != nil {
return meta, err
}
return meta, nil
}
// Codec.Encode内分配的资源,在必要时可以回收,例如内存池对象
type CodecRecycler interface {
Free(data interface{}, ctx cellnet.ContextSet)
}
func FreeCodecResource(codec cellnet.Codec, data interface{}, ctx cellnet.ContextSet) {
if codec == nil {
return
}
if recycler, ok := codec.(CodecRecycler); ok {
recycler.Free(data, ctx)
}
}