Golang解决TCP粘包拆包问题
协议定义
报文长度(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粘包拆包问题相关推荐
- golang解决TCP粘包问题
6行代码解决golang TCP粘包 转自:https://studygolang.com/articles/12483 什么是TCP粘包问题以及为什么会产生TCP粘包,本文不加讨论.本文使用gola ...
- Netty解决TCP粘包/拆包导致的半包读写问题
一.TCP粘包/拆包问题说明 TCP是个"流"协议,就是没有界限的一串数据.TCP底层并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包拆分,所以在业务上认为,一 ...
- netty解决TCP粘包/拆包导致的半包读写问题的三种方案
解决方案一:LineBasedFrameDecoder+StringDecoder来解决TCP的粘包/拆包问题 只需要在客户端和服务端加上45.46两行代码并且在发送消息的时候加上换行符即可解决TCP ...
- 《精通并发与Netty》学习笔记(13 - 解决TCP粘包拆包(一)概念及实例演示)
一.粘包/拆包概念 TCP是一个"流"协议,所谓流,就是没有界限的一长串二进制数据.TCP作为传输层协议并不不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行数据包的 ...
- golang 解决 TCP 粘包问题
什么是 TCP 粘包问题以及为什么会产生 TCP 粘包,本文不加讨论.本文使用 golang 的 bufio.Scanner 来实现自定义协议解包. 协议数据包定义 本文模拟一个日志服务器,该服务器接 ...
- Netty学习总结(5)——Netty之TCP粘包/拆包问题的解决之道
无论是服务端还是客户端,读取或者发送消息的时候,都需要考虑TCP底层的粘包/拆包机制. TCP粘包/拆包 TCP是个"流"协议. 流:没有界限的一串数据.如同河里的流水,它们是连成 ...
- Netty详解(五):Netty TCP粘包 拆包
1. 概述 无论是服务端还是客户端,我们读取或者发送消息的时候,都需要考虑TCP底层的粘包和拆包机制.下面我们来通过Netty来详解TCP底层的粘包和拆包机制. 2. TCP底层的粘包和拆包机制 TC ...
- Netty(二)——TCP粘包/拆包
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7814644.html 前面讲到:Netty(一)--Netty入门程序 主要内容: TCP粘包/拆包的基础知 ...
- TCP——粘包/拆包
TCP粘包/拆包 TCP是个"流"协议,所谓流,就是没有界限的一串数据.大家可以想想河里的流水,它们是连成一片的,其间并没有分界线.TCP底层并不了解上层业务数据的具体含义,它会根 ...
最新文章
- php使用curl可以get 模拟post
- react学习(40)----react中的jsx简介
- 《动手学深度学习 PyTorch版》学习笔记(三):线性回归
- 信息 按顺序打印commit_提高效率的 10 个 Git 小技巧
- 客户购买产品的本质是什么,如何快速寻找到客户的需求,提高转化率?
- 小技巧 ----- Java算法题标准模版
- mysql 循环插入100w
- 删除数据所有的表和存储过程
- unity 创建NGUI字体
- Percona XtraDB Cluster(PXC)原理
- GB28181协议之录像回放
- Epub,Mobi,Azw3电子书格式的区别,Mac上有什么好用的epub阅读器
- html 多选框 下拉,一个模拟html下拉多选框的原生实现.
- webpack之基础篇(四):webpack-dev-server介绍
- python读取excel合并单元_python 读写excel (合并单元格)
- matlab初值随机扰动,GRAPES区域集合预报系统模式不确定性的随机扰动技术研究
- 抽取MySQL数据成文件_MySql导入和抽取大数量级文件数据
- Scapy:send函数剖析(参数、返回值、应用)
- 用Python实现辞职信
- 一对一直播app源码开发的前端实现