Heim > Artikel > Backend-Entwicklung > Wie lese ich Daten in Blöcken von einem „net.Conn' in 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.
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)) }
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!