登录
首页 >  Golang >  Go问答

TCP 连接似乎一次读取太多字节

来源:stackoverflow

时间:2024-03-07 19:12:24 276浏览 收藏

大家好,今天本人给大家带来文章《TCP 连接似乎一次读取太多字节》,文中内容主要涉及到,如果你对Golang方面的知识点感兴趣,那就请各位朋友继续看下去吧~希望能真正帮到你们,谢谢!

问题内容

我正在用 go 编写一个 ftp 服务器,在列出文件/目录时遇到问题。似乎发生的情况是服务器单独且正确地发送每个文件,但是当从连接读取它们时,它们一次会读取多个。

我尝试更改缓冲区大小以及在发送每个文件名之前发送确认,但从连接读取时,最终读取的字节数超出预期。

这是来自服务器的相对部分:

for _, fn := range files {
    conn.write([]byte(fn.name()))
}

上面的代码中,files[]os.fileinfo,来自ioutil.readdir("./"),用于获取当前目录下的文件。测试后,这会发送正确的文件名以及每个名称的正确字节。

在客户端我有这个:

var buf [256]byte
for i := 0; i < int(amnt); i++ {
    n, err = conn.Read(buf[:])
    if err != nil {
        fmt.Printf("Error getting files: %s\n", err)
    }
    fmt.Printf("%s\n", string(buf[:n]))
}

int(amnt) 只是一个 int 来表示目录中有多少个文件,并且是正确的。

服务器正确发送所有内容,因此我确信问题在于读取 buf,但我不明白为什么它会一次读取多个文件名。


解决方案


解决这个问题的一个策略可能是开发一个松散的结构化协议,其中涉及让客户端描述文件和服务器解析文件。这可以通过在客户端写入的每个文件后发送一个新行来完成。这样服务器就可以使用 go 的 Scanner 扫描来自 tcp 连接的行:

for _, fn := range files {
    conn.write([]byte(fn.name()))
    conn.write([]byte(`\n`))
}
scanner := bufio.NewScanner(conn)
for {
        if ok := scanner.Scan(); !ok {
            break
        }
        fmt.Println(scanner.Text())
    }
    fmt.Println("Scanning ended")

go 使这成为可能,因为 TCP connection 实现了 io.Reader 接口。

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《TCP 连接似乎一次读取太多字节》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>