Heim  >  Artikel  >  Backend-Entwicklung  >  Wie lese ich Daten in Blöcken von einem „net.Conn' in Go?

Wie lese ich Daten in Blöcken von einem „net.Conn' in Go?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-09 12:36:02668Durchsuche

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

Daten in Blöcken lesen mit net.Conn.Read von Go

In Go können Sie mit net.Conn.Read auf rohe Netzwerkverbindungen zugreifen, das eingehende Datenpakete liest in ein Byte-Array. Wenn Sie jedoch die genaue Größe der eingehenden Daten nicht kennen, kann das Einlesen in ein Array mit fester Größe zu Datenkürzungen oder unnötiger Pufferung führen.

Um dies zu bewältigen, können Sie einen flexibleren Ansatz verwenden das bufio-Paket oder alternative Techniken.

Verwendung von bufio

Das bufio-Paket stellt den Reader-Typ bereit, mit dem Sie Daten in Blöcken lesen können. Sie können aus Ihrer net.Conn-Verbindung ein Reader-Objekt erstellen und dann die Methoden ReadSlice oder ReadBytes verwenden, um Daten zu lesen, bis ein bestimmtes Trennzeichen erreicht oder das Ende der Eingabe erreicht wird. Um beispielsweise Daten bis zum Ende des Pakets zu lesen, könnten Sie den folgenden Code verwenden:

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

Alternativer Ansatz

Alternativ können Sie den Typ bytes.Buffer verwenden, um eingehende Daten anzuhängen Datenblöcke und akkumulieren die Gesamtgröße:

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

Mit einem dieser Ansätze können Sie unterschiedliche Datenlängen ohne Datenkürzung verarbeiten Übermäßige Pufferung sorgt für eine effiziente Datenübertragung über Netzwerkverbindungen in Go.

Das obige ist der detaillierte Inhalt vonWie lese ich Daten in Blöcken von einem „net.Conn' in Go?. 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