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 :
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)]) } }
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!