我有以下简单的golang程序来下载Google的隐私政策。不幸的是,在读取6861字节后,它总是在错误unexpected EOF
崩溃,即使文档更长。为什么呢?
package main
import "net"
import "fmt"
import "io"
import "os"
func die(msg string, s os.Error) {
fmt.Printf("%s crashed: %v\n", msg, s)
os.Exit(1)
}
func main() {
fd, err := net.Dial("tcp", "google.com:80")
if err != nil { die("dial", err) }
req := []byte("GET /intl/en/privacy/ HTTP/1.0\r\nHost: www.google.com\r\n\r\n")
_, err = fd.Write(req)
if err != nil { die("dial write", err) }
buf := make([]byte, 1024)
nr := 1
for nr > 0 {
nr, err = io.ReadFull(fd, buf)
if err != nil { die("dial read", err) }
fmt.Printf("read %d\n", nr)
}
}
输出:
read 1024
read 1024
read 1024
read 1024
read 1024
read 1024
dial read crashed: unexpected EOF
答案 0 :(得分:11)
仅当知道 io.ReadFull(fd, buf)
可以至少 fd
字节
len(buf)
功能。
相反,请尝试以下方法:
var buf bytes.Buffer
nr, err := io.Copy(&buf, fd)
if err != nil {
die("dial read", err)
}
如果要复制到文件,请使用os.File
代替bytes.Buffer
。
答案 1 :(得分:4)
您还可以从HTTP标头中获取文件的大小,并在套接字上读取该长度。查找Content-Length响应头。
你应该随时了解IO的移动大小,文件和文件的大小,并将读数限制在预期的大小。这样可以避免很多问题。 伪代码:
$size = HTTP_RESPONSE['Content-Length'];
while(reading to $size)
{
do something with chunk;
}
答案 2 :(得分:3)
该文件不长。它只有412个字节。正弦ReadFull无法读取它返回的所有1024个字节unexpected EOF
。