51 lines
1.2 KiB
Go
51 lines
1.2 KiB
Go
// socket_stick/proto/proto.go
|
||
package proto
|
||
|
||
import (
|
||
"bufio"
|
||
"bytes"
|
||
"encoding/binary"
|
||
)
|
||
|
||
// Encode 将消息编码
|
||
func Encode(message string) ([]byte, error) {
|
||
// 读取消息的长度,转换成int32类型(占4个字节)
|
||
var length = int32(len(message))
|
||
var pkg = new(bytes.Buffer)
|
||
// 写入消息头
|
||
err := binary.Write(pkg, binary.LittleEndian, length)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
// 写入消息实体
|
||
err = binary.Write(pkg, binary.LittleEndian, []byte(message))
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
return pkg.Bytes(), nil
|
||
}
|
||
|
||
// Decode 解码消息
|
||
func Decode(reader *bufio.Reader) (string, error) {
|
||
// 读取消息的长度
|
||
lengthByte, _ := reader.Peek(4) // 读取前4个字节的数据
|
||
lengthBuff := bytes.NewBuffer(lengthByte)
|
||
var length int32
|
||
err := binary.Read(lengthBuff, binary.LittleEndian, &length)
|
||
if err != nil {
|
||
return "", err
|
||
}
|
||
// Buffered返回缓冲中现有的可读取的字节数。
|
||
if int32(reader.Buffered()) < length+4 {
|
||
return "", err
|
||
}
|
||
|
||
// 读取真正的消息数据
|
||
pack := make([]byte, int(4+length))
|
||
_, err = reader.Read(pack)
|
||
if err != nil {
|
||
return "", err
|
||
}
|
||
return string(pack[4:]), nil
|
||
}
|