Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann ich mit Golang die genaue Datenmenge aus einem net.Conn auslesen?

Wie kann ich mit Golang die genaue Datenmenge aus einem net.Conn auslesen?

Susan Sarandon
Susan SarandonOriginal
2024-11-09 09:17:02997Durchsuche

How can I read the exact amount of data from a net.Conn using Golang?

Auslesen der genauen Datenmenge mit Golang net.Conn.Read

Bei der Arbeit mit Netzwerkanwendungen in Go bietet die Methode net.Conn.Read eine bequeme Möglichkeit um Daten von einer Verbindung zu empfangen. Es funktioniert jedoch, indem es in ein vorab festgelegtes Byte-Array einliest, was den Entwickler vor die Herausforderung stellt, die genaue Datenlänge vorherzusagen.

Potenzielle Probleme mit Byte-Arrays fester Länge

Angabe einer festen -Längen-Byte-Arrays wie make([]byte, 2048) können zu zwei Möglichkeiten führen Probleme:

  1. Datenüberlauf:Wenn die empfangenen Daten die zugewiesene Puffergröße überschreiten, werden sie abgeschnitten, was zu Datenverlust führt.
  2. Unzureichend Speicherplatz: Wenn der zugewiesene Puffer größer als nötig ist, kann dies zu Speicherverschwendung und unnötiger Verarbeitung führen Overhead.

Verwendung von io.Copy für genaues Lesen

Um diese Einschränkungen zu überwinden, können wir die Funktion io.Copy nutzen, die einen robusten und effizienten Ansatz für die Datenübertragung zwischen zwei bietet io-kompatible Verbindungen. Indem wir ein bytes.Buffer-Objekt erstellen und die Daten von net.Conn dorthin weiterleiten, können wir den Puffer nach Bedarf dynamisch erweitern und so sicherstellen, dass die genaue Datenmenge erfasst wird.

Beispielcode

Hier ist ein Beispiel-Codeausschnitt, der zeigt, wie man io.Copy zum genauen Lesen von Daten verwendet:

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

In diesem Beispiel haben wir Initiieren Sie eine TCP-Verbindung zum Google-Webserver, senden Sie eine HTTP-Anfrage und erfassen Sie die Antwortdaten dynamisch mithilfe von bytes.Buffer und io.Copy. Das resultierende Buf-Objekt enthält die vollständige Antwort und stellt so sicher, dass wir die genaue Menge der übertragenen Daten lesen.

Durch die Nutzung dieses Ansatzes können Sie zuverlässig Daten von Netzwerkverbindungen empfangen, ohne die Einschränkungen, die durch vordefinierte Byte-Arrays auferlegt werden.

Das obige ist der detaillierte Inhalt vonWie kann ich mit Golang die genaue Datenmenge aus einem net.Conn auslesen?. 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