首頁 >後端開發 >Golang >如何從 Go 中的'net.Conn”讀取區塊資料?

如何從 Go 中的'net.Conn”讀取區塊資料?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-09 12:36:02682瀏覽

How to Read Data in Chunks from a `net.Conn` in Go?

使用Go 的net.Conn.Read 讀取資料區塊

在Go 中,您可以使用net.Conn.Read 存取原始網路連接,它會讀取傳入的資料包到一個位元組數組。但是,當您不知道傳入資料的確切大小時,讀入固定大小的陣列可能會導致資料截斷或不必要的緩衝。

要處理此問題,您可以採用更靈活的方法,使用bufio 套件或替代技術。

使用 bufio

bufio 套件提供 Reader 類型,讓您可以讀取資料大塊。您可以從 net.Conn 連接建立 Reader 對象,然後使用 ReadSlice 或 ReadBytes 方法讀取數據,直到您遇到特定分隔符號或到達輸入末尾。例如,要讀取資料直到資料包末尾,您可以使用以下程式碼:

package main

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

func main() {
    conn, err := net.Dial("tcp", "google.com:80")
    if err != nil {
        fmt.Println("dial error:", err)
        return
    }
    defer conn.Close()

    // Create a bufio.Reader from the net.Conn
    reader := bufio.NewReader(conn)

    // Read data in chunks until the end of the packet
    buf := []byte{}
    for {
        chunk, err := reader.ReadSlice('\n')
        if err != nil {
            if err != io.EOF {
                fmt.Println("read error:", err)
            }
            break
        }
        buf = append(buf, chunk...)
    }
    fmt.Println("total size:", len(buf))
    // fmt.Println(string(buf))
}

替代方法

或者,您可以使用 bytes.Buffer類型來附加傳入的資料資料區塊並累積總大小:

package main

import (
    "bytes"
    "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()

    // Create a bytes.Buffer to accumulate incoming data
    var buf bytes.Buffer

    // Copy data from the net.Conn to the Buffer
    if _, err = io.Copy(&buf, conn); err != nil {
        fmt.Println("copy error:", err)
    }

    fmt.Println("total size:", buf.Len())
}

透過使用這些方法之一,您可以在沒有資料的情況下處理不同的資料長度截斷或過度緩衝,確保Go中透過網路連線進行高效率資料傳輸。

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn