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)
}
}
分类:
golang
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具