高性能TcpServer_Go

 

 

 

心跳协议

C->S
IOT=0033#Meter01#1663047537917418700#01##

断包
IOT=0033#
Meter01#1663047537917418700#01##

粘包
IOT=0033#Meter01#1663047537917418700#01##IOT=0033#Meter01#1663047537917418700#01##

垃圾包
**IOT=0033#Meter01#1663047537917418700#01##

超时断开 serviceinstance.go var timeout = 30 * time.Second

S->C
IOT=0035#Meter01#1663047537917418700#01#ok#

package function

type ByteBuffer struct {
	bufferSize     int
	abyBuf         []byte
	position       int
	recvLength     int
	waitRecvRemain bool
}

func NewByteBuffer(bufferSize int) *ByteBuffer {
	p := &ByteBuffer{
		bufferSize: bufferSize,
		abyBuf:     make([]byte, bufferSize, bufferSize),
	}

	return p
}

func (p *ByteBuffer) Put(tmpbuf []byte) {
	length := len(tmpbuf)

	if p.recvLength+length >= p.bufferSize {
		p.Clear()
		return
	}

	blockCopy(tmpbuf, 0, p.abyBuf, p.recvLength, length)

	p.recvLength += length
}

func (p *ByteBuffer) Clear() {
	p.position = 0
	p.recvLength = 0
	p.waitRecvRemain = false
}

func (p *ByteBuffer) HasRemaining() bool {
	return p.position < p.recvLength
}

func (p *ByteBuffer) CheckRemaining(position int) bool {
	if p.waitRecvRemain {
		p.position = position
	}
	return p.waitRecvRemain
}

func (p *ByteBuffer) SetPosition(position int) {
	p.position = position
}

func (p *ByteBuffer) GetByte() byte {
	p.waitRecvRemain = false

	if p.position >= p.recvLength {
		p.waitRecvRemain = true
		return 0
	}

	byRet := p.abyBuf[p.position]
	p.position++
	return byRet
}

func (p *ByteBuffer) GetByteArray(length int) []byte {
	p.waitRecvRemain = false

	if p.position+length > p.recvLength {
		p.waitRecvRemain = true
		return nil
	}

	tmpbuf := make([]byte, length)
	blockCopy(p.abyBuf, p.position, tmpbuf, 0, length)

	p.position += length

	return tmpbuf
}

  

posted @ 2022-09-14 09:39  CHHC  阅读(88)  评论(0编辑  收藏  举报