协议定义

报文长度(4字节) 报文内容[]byte

服务端代码

package mainimport ("encoding/binary""fmt""net"
)func main() {fmt.Println("Starting the server ...")// 创建 listenerlistener, err := net.Listen("tcp", "localhost:50000")if err != nil {fmt.Println("Error listening", err.Error())return //终止程序}// 监听并接受来自客户端的连接for {conn, err := listener.Accept()if err != nil {fmt.Println("Error accepting", err.Error())return // 终止程序}go doServerStuff(conn)}
}func doServerStuff(conn net.Conn) {var buffer = make([]byte, 0)var msgBuffer = make([]byte, 8)var msgLen = 0for {readLen, err := conn.Read(msgBuffer)if msgLen == -1 && readLen < 4 {// 不够四个字节,说明报文长度没发过来或者没发完全.continue}// 读取报文长度.if msgLen == 0 {// 保存报文长度msgLen = int(binary.BigEndian.Uint32(msgBuffer[:4]))msgBuffer = msgBuffer[4:readLen]} else {msgBuffer = msgBuffer[:readLen]}buffer = append(buffer, msgBuffer...)if err != nil {fmt.Println("Error reading", err.Error())return //终止程序}if len(buffer) == msgLen {fmt.Printf("Received data: %v\n", string(buffer[:msgLen]))}}
}

客户端代码

package mainimport ("bufio""fmt""net""os""scago/math""strings"
)func main() {//打开连接:conn, err := net.Dial("tcp", "localhost:50000")if err != nil {//由于目标计算机积极拒绝而无法创建连接fmt.Println("Error dialing", err.Error())return // 终止程序}inputReader := bufio.NewReader(os.Stdin)for {fmt.Println("What to send to the server? Type Q to quit.")input, _ := inputReader.ReadString('\n')trimmedInput := strings.Trim(input, "\n")if trimmedInput == "Q" {return}bytes := []byte(trimmedInput)fmt.Printf("%v\n", bytes)buf := make([]byte, 0)buf = append(buf, math.Int32ToBytes(len(bytes))...)buf = append(buf, bytes...)_, err = conn.Write(buf)}
}

Golang解决TCP粘包拆包问题相关推荐

  1. golang解决TCP粘包问题

    6行代码解决golang TCP粘包 转自:https://studygolang.com/articles/12483 什么是TCP粘包问题以及为什么会产生TCP粘包,本文不加讨论.本文使用gola ...

  2. Netty解决TCP粘包/拆包导致的半包读写问题

    一.TCP粘包/拆包问题说明 TCP是个"流"协议,就是没有界限的一串数据.TCP底层并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包拆分,所以在业务上认为,一 ...

  3. netty解决TCP粘包/拆包导致的半包读写问题的三种方案

    解决方案一:LineBasedFrameDecoder+StringDecoder来解决TCP的粘包/拆包问题 只需要在客户端和服务端加上45.46两行代码并且在发送消息的时候加上换行符即可解决TCP ...

  4. 《精通并发与Netty》学习笔记(13 - 解决TCP粘包拆包(一)概念及实例演示)

    一.粘包/拆包概念 TCP是一个"流"协议,所谓流,就是没有界限的一长串二进制数据.TCP作为传输层协议并不不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行数据包的 ...

  5. golang 解决 TCP 粘包问题

    什么是 TCP 粘包问题以及为什么会产生 TCP 粘包,本文不加讨论.本文使用 golang 的 bufio.Scanner 来实现自定义协议解包. 协议数据包定义 本文模拟一个日志服务器,该服务器接 ...

  6. Netty学习总结(5)——Netty之TCP粘包/拆包问题的解决之道

    无论是服务端还是客户端,读取或者发送消息的时候,都需要考虑TCP底层的粘包/拆包机制. TCP粘包/拆包 TCP是个"流"协议. 流:没有界限的一串数据.如同河里的流水,它们是连成 ...

  7. Netty详解(五):Netty TCP粘包 拆包

    1. 概述 无论是服务端还是客户端,我们读取或者发送消息的时候,都需要考虑TCP底层的粘包和拆包机制.下面我们来通过Netty来详解TCP底层的粘包和拆包机制. 2. TCP底层的粘包和拆包机制 TC ...

  8. Netty(二)——TCP粘包/拆包

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7814644.html 前面讲到:Netty(一)--Netty入门程序 主要内容: TCP粘包/拆包的基础知 ...

  9. TCP——粘包/拆包

    TCP粘包/拆包 TCP是个"流"协议,所谓流,就是没有界限的一串数据.大家可以想想河里的流水,它们是连成一片的,其间并没有分界线.TCP底层并不了解上层业务数据的具体含义,它会根 ...

最新文章

  1. php使用curl可以get 模拟post
  2. react学习(40)----react中的jsx简介
  3. 《动手学深度学习 PyTorch版》学习笔记(三):线性回归
  4. 信息 按顺序打印commit_提高效率的 10 个 Git 小技巧
  5. 客户购买产品的本质是什么,如何快速寻找到客户的需求,提高转化率?
  6. 小技巧 ----- Java算法题标准模版
  7. mysql 循环插入100w
  8. 删除数据所有的表和存储过程
  9. unity 创建NGUI字体
  10. Percona XtraDB Cluster(PXC)原理
  11. GB28181协议之录像回放
  12. Epub,Mobi,Azw3电子书格式的区别,Mac上有什么好用的epub阅读器
  13. html 多选框 下拉,一个模拟html下拉多选框的原生实现.
  14. webpack之基础篇(四):webpack-dev-server介绍
  15. python读取excel合并单元_python 读写excel (合并单元格)
  16. matlab初值随机扰动,GRAPES区域集合预报系统模式不确定性的随机扰动技术研究
  17. 抽取MySQL数据成文件_MySql导入和抽取大数量级文件数据
  18. Scapy:send函数剖析(参数、返回值、应用)
  19. 用Python实现辞职信
  20. 一对一直播app源码开发的前端实现

热门文章

  1. PS 2022安装失败错误代码182解决办法
  2. 周-周内秒转化为utc时间 c语言实现
  3. Dreamweaver(Dw)软件下载安装以及第一个网页代码
  4. macOS未能安装在您的电脑上,找不到安装器资源。退出安装器以重新启动电脑,然后再次尝试。
  5. win11文件夹怎么加密?win11系统自带文件加密的方法步骤
  6. 电脑投屏电视,如何设置音源输出为本地电脑或电视音源?
  7. CUDA11.1在线安装
  8. C#快速扫描线算法——求取倾斜四边形与图片像素点交叠区域
  9. 如何快速开发可演示的微信小应用(应用号)
  10. 移动设备软件开发-1