请帮助我了解观察到的从套接字读取的行为。在实验中,发送方总是发送相同的行,以 '\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始终为零)。Thesock是一种自定义类型,它抽象了net.TCPConn和tls.Conn,否则将在整个代码库中使用,而不会出现问题。为什么 read by 开头的行io.Copy有时会丢失?
1 回答
蝴蝶刀刀
TA贡献1801条经验 获得超8个赞
bufio.Reader
实现io.Reader
对象的缓冲。这是什么意思?如果您使用 abufio.Reader
从io.Reader
源读取数据,它可能会从其源(并缓冲它)读取比您直接从其bufio.Reader
本身读取的数据更多的数据。
这意味着如果您使用 abufio.Reader
从sock
第一个读取,然后使用io.Copy()
,可能有一些数据已经读取sock
并位于bufio.Reader
的内部缓冲区中,这些数据io.Copy()
将看不到也不会复制。
你不应该在同一个io.Reader
来源上混合这两个。如果必须,请务必先排空bufio.Reader
's 缓冲区,然后像这样继续复制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 error
- 1 回答
- 0 关注
- 95 浏览
添加回答
举报
0/150
提交
取消