如何在golang中通知TCP客户端文件的结尾?

我想通过golang中的TCP发送文件。这是我的服务器代码:


    c is connected *net.TCPConn


    file, _ := os.Open(fn)

    defer file.Close()

    io.Copy(c, file)

    // c.CloseWrite()

和客户:


    as above, c is connected *net.TCPConn


    file, _ := os.Create("file.txt")

    defer file.Close()

    io.Copy(file, c)

我的问题是:这样,客户端无法收到文件的EOF


所以,io.Copy受阻。我必须打电话c.CloseWrite通知客户文件已结束。


如果我要发送文件,将无法正常工作,该如何解决?


拉风的咖菲猫
浏览 270回答 3
3回答

慕斯709654

如果使用的是TCP连接,则os.EOF错误表示该连接被另一端关闭。我认为可靠发送文件的唯一方法是实现多状态协议。例如。在传输的第一个状态下,告诉客户端要读取多少字节,然后进入状态2。在状态2下,如果读取了所有字节,那么我们知道它读取了整个文件。如果在读取所有字节之前检测到os.EOF,则丢弃并重新开始。

哈士奇WWW

如果您从发件人一侧关闭连接,则一切正常。我现在做了同样的事情-通过TCP传输文件。如果添加,一切正常defer conn.Close()打开连接后。例如:conn, err := net.Dial("tcp", client)defer conn.Close()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go