godocs说:
"当没有更多输入可用时,EOF是Read返回的错误。函数应仅返回EOF以指示输入的正常结束。如果在结构化数据流中意外发生EOF,则相应的错误是ErrUnexpectedEOF或其他一些错误,提供更多细节。"
在我的节目中我会love
喜欢得到ErrUnexpectedEOF,但我不知道。即使客户端在发送文件的过程中终止,我也总是得到EOF。
所以,我被困住了。通过发送EOF结束100%传输的成功文件。通过错误退出50%的文件也会发送EOF作为错误。我不知道转移前文件的总大小。
我是否可以从网上获取更多信息.TCPConn知道这是一个完整的文件吗?
答案 0 :(得分:1)
TCP是一种流媒体协议;一个字节流。这就是为什么在TCP上发明/实现文件传输协议的原因,如FTP(文件传输协议)。
但是(不推荐/思考实验)如果您可以以不包含特定字符/字节的块(例如base64 + \ n作为特定字符)发送文件,那么您可以将该特定字符用作分隔符。
现在,如果我们使用类似于此的函数来处理我们的连接:
func (srv *Server) handler(conn net.Conn) {
//...
defer srv.closeConnection(conn, nil)
reader := bufio.NewReader(conn)
writer := bufio.NewWriter(conn)
//...
conn.SetDeadline(time.Now().Add(conf.ClientTimeout))
for {
select {
case <-conf.QuitSignal:
return
default:
line, err := reader.ReadBytes('\n')
if err != nil {
return
}
//...
}
conn.SetDeadline(time.Now().Add(conf.ClientTimeout))
}
}
func (srv *Server) closeConnection(conn net.Conn, err error) {
conn.Close()
//...
}
从Reader.ReadBytes
的文档中我们读到 ReadBytes返回错误!= nil 当且仅当返回的数据不以分隔符结尾时。通过这种方式,我们可以识别出破碎的块。