tcp 所谓的分包拆包问题,其实更规范的说法,tcp是流的形式,那么就存在边界问题。
而解决边界问题的方案大概有两种,一种定义包头和包体。另外一种就是尾部标识符问题。
下边定义下伪代码,其实parse就是用来处理tcp的边界问题。
var buffer bytes.Buffer
for {
// 1. 从 TCP 连接里读取数据
tmp := make([]byte, 4096)
n, err := conn.Read(tmp)
if err != nil {
fmt.Println("连接关闭或出错:", err)
break
}
// 2. 追加到 buffer(历史数据 + 新数据)
buffer.Append(tmp[:n])
// 3. 解析循环(可能一次读到多个报文)
for {
// 尝试解析一个完整报文
msg, ok := Parse(buffer.Bytes())
if !ok {
// 没解析出完整报文(拆包)
break
}
// 消费掉已经解析的部分
buffer.Remove(len(msg))
// 业务处理
Process(msg)
}
}
评论