feature(nets):

This commit is contained in:
pyihe
2022-06-30 11:03:04 +08:00
parent 4be5d8d2a4
commit 66ec4cf8a5
2 changed files with 21 additions and 39 deletions

View File

@@ -1,12 +0,0 @@
package protocol
import "net"
type Client interface {
Close()
}
type Protocol interface {
NewClient(conn net.Conn) Client
IOLoop(client Client) error
}

View File

@@ -9,9 +9,7 @@ import (
"github.com/pyihe/go-pkg/maths" "github.com/pyihe/go-pkg/maths"
) )
type Packet interface { type IPacket interface {
HeaderLen() int
MaxMessageLen() int
Packet(message []byte) (data []byte, err error) Packet(message []byte) (data []byte, err error)
UnPacket(reader io.Reader) ([]byte, error) UnPacket(reader io.Reader) ([]byte, error)
} }
@@ -21,41 +19,36 @@ type Message interface {
Unmarshal([]byte) error Unmarshal([]byte) error
} }
type packet struct { type Packet struct {
headerLen int // 头部长度 headerLen int // 头部长度
maxDataLen int // 数据最大长度 dataSize int // 数据最大长度
initialized bool // 是否已经初始化
} }
func NewPacket(headerLen, maxDataLen int) Packet { func NewPacket(headerLen, dataMaxSize int) *Packet {
if maths.MaxInt(0, headerLen) == 0 { if maths.MaxInt(0, headerLen) == 0 {
headerLen = 4 headerLen = 4
} }
if maths.MaxInt(0, maxDataLen) == 0 { if maths.MaxInt(0, dataMaxSize) == 0 {
maxDataLen = 2046 dataMaxSize = 4096
} }
return &packet{ return &Packet{
headerLen: headerLen, headerLen: headerLen,
maxDataLen: maths.MaxInt(0, maxDataLen), dataSize: maths.MaxInt(0, dataMaxSize),
initialized: true,
} }
} }
func (p *packet) HeaderLen() int { func (p *Packet) assert() {
if p != nil { if !p.initialized {
return p.headerLen panic("Packet must be initialize by NewPacket")
} }
return -1
}
func (p *packet) MaxMessageLen() int {
if p != nil {
return p.maxDataLen
}
return -1
} }
// Packet 封包 // Packet 封包
func (p *packet) Packet(message []byte) (data []byte, err error) { func (p *Packet) Packet(message []byte) (data []byte, err error) {
if p.maxDataLen > 0 && len(message) > p.maxDataLen { p.assert()
if p.dataSize > 0 && len(message) > p.dataSize {
err = errors.New("packet: message is too large") err = errors.New("packet: message is too large")
return return
} }
@@ -68,7 +61,8 @@ func (p *packet) Packet(message []byte) (data []byte, err error) {
} }
// UnPacket 拆包 // UnPacket 拆包
func (p *packet) UnPacket(reader io.Reader) (b []byte, err error) { func (p *Packet) UnPacket(reader io.Reader) (b []byte, err error) {
p.assert()
// 先读取header中的数据长度 // 先读取header中的数据长度
header := make([]byte, p.headerLen) header := make([]byte, p.headerLen)
n, err := io.ReadFull(reader, header) n, err := io.ReadFull(reader, header)
@@ -81,7 +75,7 @@ func (p *packet) UnPacket(reader io.Reader) (b []byte, err error) {
} }
// 判断数据长度是否合法 // 判断数据长度是否合法
if p.maxDataLen > 0 && dataLen > int32(p.maxDataLen) { if p.dataSize > 0 && dataLen > int32(p.dataSize) {
err = errors.New("unpacket: message is too large") err = errors.New("unpacket: message is too large")
return return
} }