Maison > Article > développement back-end > Comment gérer la réception de données incomplètes dans les lectures TCP non bloquantes de Go ?
La lecture TCP Go n'est pas bloquante : résoudre la réception de données incomplètes
En Go, les lectures TCP ne sont pas bloquantes, ce qui signifie qu'elles reviennent immédiatement avec toutes les données disponibles, même si elles sont inférieures aux attentes. Ce comportement diffère des lectures bloquantes du C, qui attendent que la quantité de données requise soit reçue.
Raison de la lecture non bloquante
TCP fonctionne comme un flux d'octets , qui peut être fragmenté lors de la transmission. Il est donc impossible de déterminer la fin d’un message uniquement en fonction du nombre d’octets reçus. Cela nécessite des délimiteurs personnalisés ou d'autres mécanismes pour déterminer les limites des messages.
Solution aux données incomplètes
Pour lire un nombre spécifique d'octets, utilisez io.ReadAtLeast ou io.ReadFull . Pour des conditions arbitraires, effectuez une boucle sur l'appel Read jusqu'à ce qu'il n'y ait plus d'erreur ou que la condition spécifiée soit remplie.
Exemple :
<code class="go">package main import ( "fmt" "net" "time" ) func main() { conn, _ := net.Dial("tcp", "127.0.0.1:4243") // Set a deadline to prevent hanging reads _ = conn.SetReadDeadline(time.Now().Add(10 * time.Second)) // Loop to read until a newline is encountered for { buf := make([]byte, 512) n, err := conn.Read(buf) if err != nil { fmt.Println(err) break } if n > 0 { str := string(buf[:n]) if str[len(str)-1] == '\n' { fmt.Println(str) break } } } }</code>
Autres considérations
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!