首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么io.Copy在从套接字读取时有时会丢失行?

为什么io.Copy在从套接字读取时有时会丢失行?
EN

Stack Overflow用户
提问于 2022-01-13 09:53:05
回答 1查看 93关注 0票数 1

请帮助我理解从套接字读取的观察行为。

在实验中,发送方总是发送相同的行,这些行以'\n‘结尾,然后关闭套接字的写端。

接收端的此代码按预期工作,打印每一行:

代码语言:javascript
复制
    rdr := bufio.NewReader(sock)
    for {
        b, err := rdr.ReadBytes('\n')
        if err != nil {
            break
        }
        fmt.Print(string(b))
    }

但是,这个代码

代码语言:javascript
复制
n, err := io.Copy(os.Stdout, sock)

有时,从数据块开始跳过随机行数,只打印其余的行(n相应更改,err总是为零)。

sock是一种自定义类型,它抽象net.TCPConntls.Conn,否则会在代码库w/o问题中使用。

为什么io.Copy读取开始时的行有时会丢失?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-13 20:38:10

bufio.Reader实现了对io.Reader对象的缓冲。这是什么意思?如果您使用bufio.Readerio.Reader源读取数据,它可能会从其源读取更多的数据(并对其进行缓冲),而不是直接从bufio.Reader本身读取数据。

这意味着,如果您首先使用bufio.Readersock读取数据,然后使用io.Copy(),则可能已经从sock读取了一些数据,并位于bufio.Reader的内部缓冲区中,io.Copy()不会看到这些数据,也不会复制。

您不应该将这2混合在同一个io.Reader源上。如果必须这样做,那么一定要先耗尽bufio.Reader的缓冲区,然后继续从sock复制,如下所示:

代码语言:javascript
复制
// 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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70694532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档