Maison >développement back-end >Golang >Comment puis-je lire la quantité exacte de données d'un net.Conn à l'aide de Golang ?

Comment puis-je lire la quantité exacte de données d'un net.Conn à l'aide de Golang ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-09 09:17:021068parcourir

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

Lecture de la quantité exacte de données avec Golang net.Conn.Read

Lorsque vous travaillez avec des applications réseau dans Go, la méthode net.Conn.Read offre un moyen pratique pour recevoir des données d’une connexion. Cependant, il fonctionne en lisant dans un tableau d'octets prédéterminé, laissant au développeur le défi d'anticiper la longueur exacte des données.

Problèmes potentiels avec les tableaux d'octets de longueur fixe

Spécifier un nombre fixe un tableau d'octets de longueur, tel que make([]byte, 2048), peut conduire à deux potentiels problèmes :

  1. Dépassement de données : Si les données reçues dépassent la taille du tampon alloué, elles seront tronquées, entraînant une perte de données.
  2. Insuffisant Espace : Si le tampon alloué est plus grand que nécessaire, cela pourrait entraîner un gaspillage de mémoire et un traitement inutile surcharge.

Utilisation de io.Copy pour une lecture précise

Pour surmonter ces limitations, nous pouvons utiliser la fonction io.Copy, qui fournit une approche robuste et efficace pour transférer des données entre deux Connexions compatibles io. En créant un objet bytes.Buffer et en y acheminant les données de net.Conn, nous pouvons étendre dynamiquement le tampon si nécessaire, garantissant ainsi que la quantité exacte de données est capturée.

Exemple de code

Voici un exemple d'extrait de code qui montre comment utiliser io.Copy pour une lecture précise des données :

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

Dans cet exemple, nous initiez une connexion TCP au serveur Web de Google, envoyez une requête HTTP et capturez dynamiquement les données de réponse à l'aide de bytes.Buffer et io.Copy. L'objet buf résultant contiendra la réponse complète, garantissant que nous lisons la quantité exacte de données transférées.

En tirant parti de cette approche, vous pouvez recevoir de manière fiable des données à partir de connexions réseau sans les limitations imposées par les tableaux d'octets prédéfinis.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn