请帮助我理解从套接字读取的观察行为。
在实验中,发送方总是发送相同的行,这些行以'\n‘结尾,然后关闭套接字的写端。
接收端的此代码按预期工作,打印每一行:
rdr := bufio.NewReader(sock)
for {
b, err := rdr.ReadBytes('\n')
if err != nil {
break
}
fmt.Print(string(b))
}但是,这个代码
n, err := io.Copy(os.Stdout, sock)有时,从数据块开始跳过随机行数,只打印其余的行(n相应更改,err总是为零)。
sock是一种自定义类型,它抽象net.TCPConn和tls.Conn,否则会在代码库w/o问题中使用。
为什么io.Copy读取开始时的行有时会丢失?
发布于 2022-01-13 20:38:10
bufio.Reader实现了对io.Reader对象的缓冲。这是什么意思?如果您使用bufio.Reader从io.Reader源读取数据,它可能会从其源读取更多的数据(并对其进行缓冲),而不是直接从bufio.Reader本身读取数据。
这意味着,如果您首先使用bufio.Reader从sock读取数据,然后使用io.Copy(),则可能已经从sock读取了一些数据,并位于bufio.Reader的内部缓冲区中,io.Copy()不会看到这些数据,也不会复制。
您不应该将这2混合在同一个io.Reader源上。如果必须这样做,那么一定要先耗尽bufio.Reader的缓冲区,然后继续从sock复制,如下所示:
// First drain the buffer:
n, err := io.Copy(os.Stdout, rdr)
// Handle error
// Then proceed with the socket:
n, err = io.Copy(os.Stdout, sock)
// Handle errorhttps://stackoverflow.com/questions/70694532
复制相似问题