使用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)
}
}