Heim  >  Artikel  >  Backend-Entwicklung  >  Wie lese ich Daten von einem Go net.Conn genau aus?

Wie lese ich Daten von einem Go net.Conn genau aus?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-09 13:18:02536Durchsuche

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

Genaues Lesen von Daten in Go's net.Conn

Im Bereich der Go-Netzwerkanwendungen besteht das Problem von Das genaue Auslesen von Daten aus einem Netz.Conn kann entstehen. Die integrierte Conn.Read-Funktion ist zwar praktisch, liest jedoch Daten in ein benutzerdefiniertes Byte-Array mit begrenzter Größe. Dies kann abhängig von der tatsächlichen Datengröße zu einer unzureichenden oder übermäßigen Pufferzuweisung führen.

Um dieses Dilemma zu lösen, kann man das leistungsstarke bufio-Paket nutzen. Durch die dynamische Erweiterung des internen Puffers nach Bedarf optimiert bufio den Prozess des Lesens von Inhalten unbekannter Länge. Hier ist ein modifiziertes Beispiel:

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

Dieser Code initialisiert ein bufio.Scanner-Objekt mit net.Conn als Quelle. Der Scanner liest kontinuierlich Daten, bis er auf eine End-of-File-Bedingung (EOF) oder einen Fehler stößt. Dieser Ansatz kümmert sich automatisch um die Puffererweiterung beim Einströmen von Daten und gewährleistet so ein genaues und effizientes Lesen.

Alternativ können Sie für einen direkteren Ansatz io.Copy verwenden, wie von @fabrizioM vorgeschlagen:

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())
}

In diesem Beispiel wird io.Copy verwendet, um den Inhalt von net.Conn in einen bytes.Buffer zu übertragen, der intern die Pufferzuweisung verwaltet und Erweiterung.

Das obige ist der detaillierte Inhalt vonWie lese ich Daten von einem Go net.Conn genau aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn