返回顶部
首页 > 资讯 > 精选 >go语言如何处理TCP拆包/粘包
  • 425
分享到

go语言如何处理TCP拆包/粘包

2023-06-22 00:06:39 425人浏览 独家记忆
摘要

这篇文章主要讲解了“Go语言如何处理tcp拆包/粘包”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“go语言如何处理TCP拆包/粘包”吧!part 1最近在学习go自带的rpc,看完了一遍想着

这篇文章主要讲解了“Go语言如何处理tcp拆包/粘包”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“go语言如何处理TCP拆包/粘包”吧!

part 1

最近在学习go自带的rpc,看完了一遍想着自己实现一个codec,也就是自定义消息的序列化和反序列化。消息的序列化和反序列化涉及到两步:

网络中读取数据和将数据写到网络中;

根据拿到的二进制数据反序列化以及把现有的对象序列化成二进制数据。而这个过程中就需要处理TCP的拆包粘包了。

TCP的拆包/粘包也算是网络编程中一个比较基础的问题了,具体的问题含义和解决方式也不再详细描述了。虽然作为实现应用层逻辑的程序员可能根本不需要关心这个,作为中间件开发,同时也出于学习go语言的目的,还是稍微进行一下练习。

part 2

TCP拆包粘包的解决思路:在读取数据时,将读取到的二进制数据在正确的位置进行分割即可。这里直接使用head+body的方式,也就是在发送数据时先将整个数据的大小附加在数据前,就像这样:

+++++++++++++++++++++++++++++++++++++
size (2 bytes)  | body (size bytes)
+++++++++++++++++++++++++++++++++++++

这里将数据包的size作为head
注:这里举的例子里,size占2个byte;size具体占用的byte数可以根据实际情况决定

part 3

server具体实现:

func doConn(conn net.Conn) {    var (        buffer = bytes.NewBuffer(make([]byte, 0, BUF_SIZE)) //buffer用来缓存读取到的数据        readBytes = make([]byte, BUF_SIZE) //readBytes用来接收每次读取的数据,每次读取完成之后将readBytes添加到buffer中        isHead = true //用来标识当前的状态:正在处理size部分还是body部分        bodyLen = 0 //表示body的长度    )    for {        //首先读取数据        readByteNum, err := conn.Read(readBytes)        if err != nil {            log.Fatal(err)            return        }        buffer.Write(readBytes[0:readByteNum])//将读取到的数据放到buffer中                // 然后处理数据        for {            if isHead {                if buffer.Len() >= HEAD_SIZE {                    isHead = false                    head := make([]byte, HEAD_SIZE)                    _, err = buffer.Read(head)                    if err != nil {                        log.Fatal(err)                        return                    }                    bodyLen = int(binary.BigEndian.Uint16(head))                } else {                    break;                }            }            if !isHead {                if buffer.Len() >= bodyLen {                    body := make([]byte, bodyLen)                    _, err = buffer.Read(body[:bodyLen])                    if err != nil {                        log.Fatal(err)                        return                    }                    fmt.Println("received body: " + string(body[:bodyLen]))                    isHead = true                } else {                    break;                }            }        }    }        func HandleTcp() { listener, err := net.Listen("tcp", ":1234") if err != nil {  log.Fatal(err)  return } log.Println("start listening on 1234") for {  conn, err := listener.Accept()  if err != nil {   log.Fatal(err)   return  }  go doConn(conn) }}

client具体实现:

func SendStringwithTcp(arg string) error { conn, err := net.Dial("tcp", ":1234") if err != nil {  log.Fatal(err)  return err } head := make([]byte, server.HEAD_SIZE) content := []byte(arg) headSize := len(content) binary.BigEndian.PutUint16(head, uint16(headSize))    //先写入head部分,再写入body部分 _, err = conn.Write(head) if err != nil {  log.Fatal(err)  return err } _, err = conn.Write(content) if err != nil {  log.Fatal(err)  return err } return nil}

感谢各位的阅读,以上就是“go语言如何处理TCP拆包/粘包”的内容了,经过本文的学习后,相信大家对go语言如何处理TCP拆包/粘包这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: go语言如何处理TCP拆包/粘包

本文链接: https://lsjlt.com/news/301644.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • go语言如何处理TCP拆包/粘包
    这篇文章主要讲解了“go语言如何处理TCP拆包/粘包”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“go语言如何处理TCP拆包/粘包”吧!part 1最近在学习go自带的rpc,看完了一遍想着...
    99+
    2023-06-22
  • go语言处理TCP拆包/粘包的具体实现
    目录part 1part 2part 3part 1 最近在学习go自带的rpc,看完了一遍想着自己实现一个codec,也就是自定义消息的序列化和反序列化。消息的序列化和反序...
    99+
    2022-06-07
    GO go语言
  • Netty如何解决TCP 粘包拆包
    小编给大家分享一下Netty如何解决TCP 粘包拆包,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!什么是粘包/拆包    ...
    99+
    2023-06-20
  • Golang通过包长协议处理TCP粘包的问题解决
    目录tcp粘包现象代码重现tcp粘包问题处理方法tcp粘包产生的原因这里就不说了,因为大家能搜索TCP粘包的处理方法,想必大概对TCP粘包有了一定了解,所以我们直接从处理思路开始讲起...
    99+
    2024-04-02
  • workerman 自定义的协议如何解决粘包拆包
    前言:         由于最近在使用 workerman 实现 Unity3D 联机游戏的服务端,虽然也可以通过 TCP 协议直接通信,但是在实际测试的过程中发现了一些小问题。         比如双方的数据包都是字符串的方式吗,还有就因...
    99+
    2023-09-07
    TCP粘包拆包 workerman unity3d PHP网游服务
  • go语言如何导包
    这篇文章主要介绍“go语言如何导包”,在日常操作中,相信很多人在go语言如何导包问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”go语言如何导包”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!在go语言中,可...
    99+
    2023-07-04
  • Go语言如何处理大数据日志打包?
    在当今的互联网时代,每个人都会产生大量的数据日志。因为这些数据日志往往是以文本形式存储,所以会占用大量的磁盘空间。为了解决这个问题,我们需要对这些数据日志进行打包,以减少磁盘空间的占用。本文将介绍如何使用Go语言处理大数据日志打包的问题。...
    99+
    2023-09-01
    大数据 日志 打包
  • Go语言包和包管理详解
    目录1 包简介1.1 工作空间1.2 源文件1.3 包命名1.4 main 包2导包2.1 两种方式2.2 包的别名2.3 简洁模式2.4非导入模式(匿名导入)2.5 导包的路径2....
    99+
    2024-04-02
  • Go语言包如何使用
    本篇内容介绍了“Go语言包如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!包(package)是多个Go源码的集合,是一种高级的代码复...
    99+
    2023-07-04
  • Go语言如何导入包
    这篇“Go语言如何导入包”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Go语言如何导入包”文章吧。在Go语言中,可以通过im...
    99+
    2023-07-04
  • Go语言之包管理
    什么是 Go 语言中的包我们在使用其他语言,比如 Java ,是有包的概念的。它是 Java 语言中组织我们的 Java 文件的一个概念,比如java.lang这个包,它里面有很多我们常用的类,比如 Str...
    99+
    2024-04-02
  • 如何利用自然语言处理技术打包Go Load?
    自然语言处理技术已经成为各个领域的热门话题,它的应用领域包括机器翻译、自动摘要、情感分析、问答系统等。在软件开发中,自然语言处理技术可以帮助我们更高效地处理和管理代码。本文将介绍如何利用自然语言处理技术打包Go Load,以及如何将其应用于...
    99+
    2023-06-22
    load 打包 自然语言处理
  • GO语言打包自然语言处理项目,Django框架如何应用?
    随着自然语言处理技术越来越成熟,越来越多的开发者开始使用自然语言处理技术来解决各种问题。GO语言是一种高效、灵活的编程语言,而Django框架则是一种流行的Python Web框架。本文将介绍如何使用GO语言打包自然语言处理项目,并将其整...
    99+
    2023-06-07
    打包 自然语言处理 django
  • GO语言包管理工具go mod以及包详解
    目录1.GO中包的定义与介绍2. 包管理工具 go mod2.1 自定义包 (可以包含多个go文件)2.1.1 建立项目并go mod init初始化2.1.2 自定义一个包(文件夹...
    99+
    2024-04-02
  • 如何在Go中使用NPM包进行自然语言处理?
    自然语言处理(NLP)是一种人工智能技术,它可以帮助计算机理解和处理人类语言。在Go语言中,我们可以使用NPM包来进行自然语言处理。本文将介绍如何在Go中使用NPM包进行自然语言处理,并提供一些示例代码来帮助您入门。 首先,您需要安装Go语...
    99+
    2023-07-02
    npm 函数 自然语言处理
  • Go语言中flag包如何使用
    今天就跟大家聊聊有关Go语言中flag包如何使用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。这一章所学的任何代码,都要编译成.exe才能跑,禁止右...
    99+
    2024-04-02
  • 深入理解Go语言包依赖
    go 语言的包依赖基于模块概念,通过 go mod 命令管理依赖。最佳实践包括使用清晰的模块路径、指定依赖版本、使用依赖锁定和优先使用标准库。实战案例说明了如何通过 go get 命令下...
    99+
    2024-04-04
    go语言 包依赖 标准库
  • GO语言中如何优雅地打包自然语言处理,让Django框架更高效?
    自然语言处理(NLP)是一种涉及计算机科学、人工智能和语言学的技术,用于让计算机能够理解、处理和生成自然语言。在当今的数字化时代,NLP技术已经成为了许多应用程序的关键组成部分。而GO语言作为一种高效、可靠的编程语言,也被越来越多的人所关...
    99+
    2023-06-07
    打包 自然语言处理 django
  • 如何在 Go语言中使用日志包
    目录Go 语言标准库之log 包如何将日志消息存储在 Go 中的文件中定制你的日志记录器总结引言: 在我们的日常编程中,日志很重要。只要是我们写代码,就有可能出现 Bug。日志文件就...
    99+
    2024-04-02
  • Go语言中如何打包接口函数?
    Go语言是一门非常流行的编程语言,在很多场景下都有广泛的应用。在Go语言中,函数是一等公民,这就意味着我们可以像对待变量一样对待函数。而且,Go语言中还有一个非常重要的概念——接口。接口是一种抽象的类型,通过接口可以实现多态性,让程序更加灵...
    99+
    2023-09-20
    打包 接口 函数
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作