首頁 > 後端開發 > Golang > 主體

如何從 Go net.Conn 準確讀取資料?

Patricia Arquette
發布: 2024-11-09 13:18:02
原創
533 人瀏覽過

How do I read data accurately from a Go net.Conn?

在Go 的net.Conn 中準確讀取資料

在Go 網路應用領域,問題精確地從網路讀取資料。 Conn 可能會出現。內建的 Conn.Read 函數雖然方便,但可以將資料讀取到使用者定義的大小有限的位元組數組中。這可能會導致緩衝區分配不足或過多,具體取決於實際資料大小。

為了解決這個困境,可以利用強大的 bufio 包。透過根據需要動態擴展內部緩衝區,bufio 簡化了讀取未知長度內容的過程。以下是一個修改後的範例:

package main

import (
    "bufio"
    "fmt"
    "io"
    "net"
)

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

    // Create a bufio.Scanner to read the response.
    scanner := bufio.NewScanner(conn)

    // Iterate over the lines of the response.
    for scanner.Scan() {
        line := scanner.Text()
        fmt.Println(line)
    }

    // Check for any errors that occurred during scanning.
    if err := scanner.Err(); err != nil {
        fmt.Println("scanner error:", err)
    }
}
登入後複製

此程式碼使用 net.Conn 作為其來源來初始化 bufio.Scanner 物件。掃描器會連續讀取數據,直到遇到文件結束 (EOF) 條件或錯誤。這種方法會在資料流入時自動處理緩衝區擴展,確保準確且有效率的讀取。

或者,對於更直接的方法,您可以使用io.Copy,如@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")

    // Create a bytes.Buffer to store the response.
    var buf bytes.Buffer
    io.Copy(&buf, conn)

    // Print the total size of the response.
    fmt.Println("total size:", buf.Len())
}
登入後複製

此範例使用io.Copy 將net.Conn 的內容傳送到bytes.Buffer 中,此緩衝區內部管理緩衝區分配和擴展。

以上是如何從 Go net.Conn 準確讀取資料?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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