登录
首页 >  Golang >  Go问答

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

来源:Golang技术栈

时间:2023-05-02 06:35:11 305浏览 收藏

知识点掌握了,还需要不断练习才能熟练运用。下面golang学习网给大家带来一个Golang开发实战,手把手教大家学习《使用 Golang net.Conn.Read 读取整个数据》,在实现功能的过程中也带大家重新温习相关知识点,温故而知新,回头看看说不定又有不一样的感悟!

问题内容

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

正确答案

这在很大程度上取决于您要做什么,以及您期望什么样的数据,例如,如果您只想阅读直到 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))
}

//编辑:为了完整起见和@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())
}

好了,本文到此结束,带大家了解了《使用 Golang net.Conn.Read 读取整个数据》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>