首頁 > 後端開發 > Golang > 如何使用Go的net.Conn.Read讀取未知長度的資料?

如何使用Go的net.Conn.Read讀取未知長度的資料?

DDD
發布: 2024-11-10 00:15:02
原創
630 人瀏覽過

How to Read Data of Unknown Length with Go's net.Conn.Read?

使用Go 的net.Conn.Read 讀取未知長度的資料

在Go 中使用網路應用程式時,Conn.Read函數提供從連接的端點檢索資料的方法。然而,它使用有限的位元組數組進行操作,當內容的長度未知時,這可能並不總是足夠。

問題:如何解決這個挑戰以精確讀取整個可用資料?

答案: 方法的選擇取決於應用程式的特定要求和資料的性質。以下是一些可能的解決方案:

使用bufio

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

    reader := bufio.NewReader(conn)
    buf, err := ioutil.ReadAll(reader)
    if err != nil {
        if err != io.EOF {
            fmt.Println("read error:", err)
        }
        return
    }
    fmt.Println("total size:", len(buf))
}
登入後複製

使用bytes.Buffer

對於需要的應用程序,請考慮使用bytes.Buffer任意大小的緩衝區。以下修改後的範例示範了這種方法:

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())
}
登入後複製

注意: 這些解決方案假設連線保持活動狀態並且繼續接收數據,直到應用程式讀取全部資料或到達EOF。如果連線提前終止,接收到的資料大小可能會不完整。

以上是如何使用Go的net.Conn.Read讀取未知長度的資料?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板