首页 > 其他分享 >golang基于长度解决粘包问题(gnet)

golang基于长度解决粘包问题(gnet)

时间:2024-03-11 16:16:01浏览次数:26  
标签:err gnet 粘包 golang codec 长度 DTUSocketServer

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

标签:err,gnet,粘包,golang,codec,长度,DTUSocketServer
From: https://www.cnblogs.com/jomzhang/p/18066343

相关文章

  • golang开发_goroutine在项目中的使用姿势
    很多初级的Gopher在学习了goroutine之后,在项目中其实使用率不高,尤其一些跨语言过来的人,对并发编程理解不深入,可能很多人只知道gofunc(),或者掌控不够,谨慎一些,尽量少使用或者不使用,用的话就是gofunc(),主要列一下我们这边的主要使用方法。goroutine在项目中的使用方法看一下样......
  • golang结构体
    在Go语言中,结构体(Struct)是一种用户定义的数据类型,用于组合多个不同类型的字段,每个字段可以是任意的基本类型或其他结构体类型。结构体是一种复合数据类型,用于组织和存储相关的数据。以下是结构体的一些基本概念和用法:1.定义结构体//定义一个结构体typePersonstruct{Firs......
  • golang入门概览
    一、语法golang中数据类型有值类型(boolintstring)和派生类型(structinterface等等)。值类型通常在栈上分配内存,派生类型通常在堆上分配内存。golang中的函数调用,只有值传递,没有引用传递。但是golang提供了指针,使用指针可以达到引用传参的效果,在函数内部修改参数后可以在外......
  • golang将时间转为时间戳碰到的问题
    golang将字符串"2024-03-0716:00:00"转为时间戳代码如下:packagemainimport("fmt""time")funcmain(){//定义时间格式,与字符串中的时间格式匹配constlayout="2006-01-0215:04:05"//要转换的时间字符......
  • golang进阶之反射
    目录一、go中变量的内在机制二、反射1.反射是把双刃剑2.反射的简介三、reflect库1.reflect.TypeOf(1)reflect.Type的name和kind(2)kind的能返回的类型如下2.reflect.ValueOf(1)反射取值(2)反射改值3.isNil()和isValid()四、结构体的反射1.StructField类型2.结构体反射示例(1......
  • Golang使用SSE(EventSource)
    gopackagemainimport( "fmt" "gopkg.in/antage/eventsource.v1" "log" "net/http" "time")funcmain(){ es:=eventsource.New(nil,nil) deferes.Close() http.Handle("/",http.FileServe......
  • 从数据库中随机选取数据(基于golang,xorm)
    一、 从MySQL数据库中随机选取数据,可以使用SQL的 ORDERBYRAND() 语句来实现。具体步骤如下:定义一个结构体用于存储数据typeUserstruct{Idint64NamestringAgeint}建立与数据库的连接,并获取一个 Engine 实例engine,err:=xorm.NewE......
  • golang项目用k8s部署的流程
    摘要:本文将详细介绍如何使用Kubernetes(K8S)部署一套Golang微服务项目,并给出了完整的实施步骤和相应代码示例,旨在指导刚入行的开发者完成这一任务。一、整体流程下面是使用K8S部署Golang微服务项目的整体流程,我们将在接下来的内容中详细介绍每一步骤。1.准备容器镜像2.创建K8S集......
  • 万字长文讲解Golang pprof 的使用
    往期好文推荐⭐️⭐️⭐️:#golangpprof监控系列(1)——gotrace统计原理与使用#golangpprof监控系列(2)——memory,block,mutex使用#golangpprof监控系列(3)——memory,block,mutex统计原理#golangpprof监控系列(4)——goroutinethread统计原理#golangpprof......
  • Golang 执行shell命令
    Golang执行shell命令参考:golang执行shell命令大全https://saucer-man.com/backend_development/571.html1.执行命令并获得输出结果CombinedOutput()  返回standardoutputandstandarderrorfuncmain(){cmd:=exec.Command("ls","-lah")out,err:=......