一尘不染

用Golang net.Conn.Read读取整个数据

go

因此,我在Go中构建了一个网络应用程序,我看到它Conn.Read读入了我创建时使用的有限字节数组,make([]byte, 2048)现在的
问题 是我不知道内容的确切长度,因此它可能是太多或不足。
我的问题是我如何才能读取准确的数据量。我认为我必须使用bufio,但不确定。


阅读 2682

收藏
2020-07-02

共1个答案

一尘不染

这在很大程度上取决于您要执行的操作以及所期望的数据类型,例如,如果您只想读到EOF,则可以使用以下内容:

func main() {
    conn, err := net.Dial("tcp", "google.com:80")
    if err != nil {
        fmt.Println("dial error:", err)
        return
    }
    defer conn.Close()
    fmt.Fprintf(conn, "GET / HTTP/1.0\r\n\r\n")

    buf := make([]byte, 0, 4096) // big buffer
    tmp := make([]byte, 256)     // using small tmo buffer for demonstrating
    for {
        n, err := conn.Read(tmp)
        if err != nil {
            if err != io.EOF {
                fmt.Println("read error:", err)
            }
            break
        }
        //fmt.Println("got", n, "bytes.")
        buf = append(buf, tmp[:n]...)

    }
    fmt.Println("total size:", len(buf))
    //fmt.Println(string(buf))
}

// edit:出于完整性考虑,@ fabrizioM提出了很棒的建议,这完全让我无视:

func main() {
    conn, err := net.Dial("tcp", "google.com:80")
    if err != nil {
        fmt.Println("dial error:", err)
        return
    }
    defer conn.Close()
    fmt.Fprintf(conn, "GET / HTTP/1.0\r\n\r\n")
    var buf bytes.Buffer
    io.Copy(&buf, conn)
    fmt.Println("total size:", buf.Len())
}
2020-07-02