Golang通过包长协议处理TCP粘包

tcp粘包产生的原因这里就不说了,因为大家能搜索TCP粘包的处理方法,想必大概对TCP粘包有了一定了解,所以我们直接从处理思路开始讲起

Golang通过包长协议处理TCP粘包_第1张图片

tcp粘包现象代码重现

首先,我们来重现一下TCP粘包,然后再此基础之上解决粘包的问题,这里给出了client和server的示例代码如下

/*
    文件名:client.go
    client客户端的示例代码(未处理粘包问题)
    通过无限循环无时间间隔发送数据给server服务器
    server将会不间断的出现TCP粘包问题
*/
package main
import (
    "fmt"
    "net"
)
func main() {
   
    conn, err := net.Dial("tcp", ":9000")
    if err != nil {
   
        return
    }
    defer conn.Close()
    for {
   
        s := "Hello, Server!"
        n, err := conn.Write([]byte(s))
        if err != nil {
   
            fmt.Println("Error:", err)
            fmt.Println("Error N:", n)
            return
        }
        // 这里通过限制发送频率和时间间隔来解决TCP粘包
        // 虽然能够实现,但是频率被限制,效率也会被限制
        // time.Sleep(time.Second * 1)
    }
}
/*
    文件名:server.go
    server服务端的示例代码(未处理粘包问题)
    服务端接收到数据后立即打印
    此时将会不间断的出现TCP粘包问题
*/
package main
import (
    "fmt"
    "net"
)
func main() {
   
    ln, err := net.Listen("tcp", ":9000")
    if err != nil {
   
        return
    }
    for {
   
        conn, err := ln.Accept()
        

你可能感兴趣的:(golang,golang,tcp/ip,网络)