mirror of
https://github.com/pyihe/go-pkg.git
synced 2025-11-02 04:03:41 +08:00
feature(nets):
This commit is contained in:
@@ -1,12 +0,0 @@
|
|||||||
package protocol
|
|
||||||
|
|
||||||
import "net"
|
|
||||||
|
|
||||||
type Client interface {
|
|
||||||
Close()
|
|
||||||
}
|
|
||||||
|
|
||||||
type Protocol interface {
|
|
||||||
NewClient(conn net.Conn) Client
|
|
||||||
IOLoop(client Client) error
|
|
||||||
}
|
|
||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user