golang基於長度解決粘包問題(gnet)

使用gnet框架處理Socket粘包問題

當服務端處理舊業務tcp scoket,舊的業務是Netty Socket使用的是2個字節的長度定義數據的大小。官方支持ICodec去處理,但文檔不太友好,這裏附上使用方法

import (
	"github.com/panjf2000/gnet"
)

type DTUSocketServer struct {
	*gnet.EventServer
}
var codec gnet.ICodec
//2個字節長度編解碼器,使用方法,外部初始化調用
func InitDTUTerminalSocketServer() {
	if codec == nil {
		encoderConfig := gnet.EncoderConfig{
			ByteOrder:                       binary.BigEndian,
			LengthFieldLength:               2,
			LengthAdjustment:                0,
			LengthIncludesLengthFieldLength: false,
		}
		decoderConfig := gnet.DecoderConfig{
			ByteOrder:           binary.BigEndian,
			LengthFieldOffset:   0,
			LengthFieldLength:   2,
			LengthAdjustment:    0,
			InitialBytesToStrip: 2,
		}
		codec = gnet.NewLengthFieldBasedFrameCodec(encoderConfig, decoderConfig)
	}

	addr := fmt.Sprintf("tcp://:%d", 8888)
	Server := new(DTUSocketServer)
    //codec應用
	err := gnet.Serve(Server, addr, gnet.WithMulticore(true), gnet.WithCodec(codec), gnet.WithReusePort(true), gnet.WithTCPKeepAlive(5*time.Second))
	if err != nil {
		//log.Errorf("DTU終端TCP服務啓動失敗:%s", err)
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章