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

dil*_*ish 3 networking tcp file go

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

    c is connected *net.TCPConn

    file, _ := os.Open(fn)
    defer file.Close()
    io.Copy(c, file)
    // c.CloseWrite()
Run Code Online (Sandbox Code Playgroud)

和客户:

    as above, c is connected *net.TCPConn

    file, _ := os.Create("file.txt")
    defer file.Close()
    io.Copy(file, c)
Run Code Online (Sandbox Code Playgroud)

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

因此,io.Copy被阻止。我必须打电话c.CloseWrite通知客户文件已结束。

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

All*_*ton 5

如果使用TCP连接,则os.EOF错误表示该连接已被另一端关闭。

我认为可靠地发送文件的唯一方法是实现多状态协议。

例如。在传输的第一个状态下,告诉客户端要读取多少字节并进入状态2。在状态2中,如果读取了所有字节,那么我们知道它读取了整个文件。如果在读取所有字节之前检测到os.EOF,则丢弃并重新开始。

  • 所以我必须使用c.Read,io.Copy在这里没用? (2认同)