Go TCP Read não é bloqueador: abordando recepção de dados incompleta
No Go, as leituras TCP não são bloqueadoras, o que significa que retornam imediatamente com quaisquer dados disponíveis, mesmo que sejam inferiores ao esperado. Esse comportamento difere das leituras de bloqueio de C, que esperam até que a quantidade necessária de dados seja recebida.
Motivo para leitura sem bloqueio
TCP opera como um fluxo de bytes , que pode ser fragmentado durante a transmissão. Portanto, é impossível determinar o final de uma mensagem baseado apenas no número de bytes recebidos. Isso requer delimitadores personalizados ou outros mecanismos para determinar os limites da mensagem.
Solução para dados incompletos
Para ler um número específico de bytes, use io.ReadAtLeast ou io.ReadFull . Para condições arbitrárias, faça um loop na chamada Read até que não haja nenhum erro ou a condição especificada seja atendida.
Exemplo:
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
}
}
}
}
Outras considerações
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3