La lectura de TCP de Go no es bloqueante: abordar la recepción de datos incompletos
En Go, las lecturas de TCP no son de bloqueo, lo que significa que regresan inmediatamente con cualquier dato disponible, incluso si es menor de lo esperado. Este comportamiento difiere de las lecturas de bloqueo de C, que esperan hasta que se recibe la cantidad requerida de datos.
Motivo de la lectura sin bloqueo
TCP opera como un flujo de bytes , que puede fragmentarse durante la transmisión. Por lo tanto, es imposible determinar el final de un mensaje basándose únicamente en la cantidad de bytes recibidos. Esto requiere delimitadores personalizados u otros mecanismos para determinar los límites de los mensajes.
Solución para datos incompletos
Para leer una cantidad específica de bytes, use io.ReadAtLeast o io.ReadFull . Para condiciones arbitrarias, realice un bucle en la llamada de lectura hasta que no haya ningún error o se cumpla la condición especificada.
Ejemplo:
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
}
}
}
}
Otras consideraciones
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3