Maison > développement back-end > Golang > Comment bufio.Reader résout-il le cadrage des messages de socket TCP dans Go ?

Comment bufio.Reader résout-il le cadrage des messages de socket TCP dans Go ?

Susan Sarandon
Libérer: 2024-11-25 19:49:11
original
801 Les gens l'ont consulté

How Does bufio.Reader Solve TCP Socket Message Framing in Go?

Comprendre le cadrage des messages TCP Socket : le rôle de bufio.Reader

Dans le code de votre serveur Go, vous avez exprimé votre confusion quant à la manière dont net.Conn .Read détecte la fin d'un message reçu sur un socket TCP persistant. Contrairement à des protocoles tels que HTTP, TCP lui-même ne fournit aucun mécanisme naturel de tramage des messages. Il est de la responsabilité de l'application d'implémenter son propre protocole pour le cadrage des messages.

Entrez bufio.Reader : Amélioration de la gestion des flux

Pour faciliter une gestion efficace et flexible des flux, Go fournit le bufio.Type de lecteur. Envelopper votre connexion TCP dans un bufio.Reader offre plusieurs avantages :

  • Efficacité d'E/S améliorée : bufio.Reader utilise des techniques de mise en mémoire tampon pour minimiser les appels système et la copie de données, ce qui entraîne Opérations d'E/S plus rapides.
  • Cadre simplifié : Il fournit des méthodes pratiques pour lire les données de manière structurée, ce qui facilite l'analyse des messages selon votre protocole.

Exemple de cadrage de messages avec bufio.Lecteur :

Voici un exemple qui montre comment vous pouvez utiliser bufio.Reader pour analyser les messages sur votre serveur TCP :

package main

import (
    "bufio"
    "fmt"
    "net"
)

func main() {
    ln, err := net.Listen("tcp", ":8080")
    if err != nil {
        // Handle error
    }

    for {
        conn, err := ln.Accept()
        if err != nil {
            // Handle error
        }

        go handleConnection(conn)
    }
}

func handleConnection(conn net.Conn) {
    defer conn.Close()

    // Wrap the connection in a bufio.Reader
    buff := make([]byte, 50)
    c := bufio.NewReader(conn)

    for {
        // Read a single byte representing the message length
        size, err := c.ReadByte()
        if err != nil {
            // Handle error
        }

        // Read the message according to its size
        _, err = io.ReadFull(c, buff[:int(size)])
        if err != nil {
            // Handle error
        }

        // Process the received message
        fmt.Printf("Received message: %x\n", buff[:int(size)])
    }
}
Copier après la connexion

Dans ce Par exemple, chaque message possède un octet d'en-tête qui spécifie sa longueur. En utilisant bufio.ReadByte(), nous lisons d'abord la longueur, puis utilisons io.ReadFull pour lire le reste du message en fonction de la longueur spécifiée. Cela vous permet d'analyser efficacement des messages de différentes tailles.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal