tcp 关于拆包分包的的问题

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

评论

(= ̄ω ̄=)··· 暂无内容!

回复

邮箱