Http net.Conn从未收到EOF
我试图通过Http net.Conn从未收到EOF,http,go,tcp,Http,Go,Tcp,我试图通过net.ConnTCP连接发送HTTP请求并读取后续响应,但在读取时,我似乎从未从连接接收到EOF。这使得像io.Copy或ioutil.ReadAll这样的函数变得无用,因为它们会永远阻塞 代码: client.go const requestString=“GET/test HTTP/1.1\r\n”+“主机:127.0.0.1:8080\r\n\r\n” func main(){ 拨号器:=net.dialer{} conn,err:=拨号器拨号(“tcp”,“127.0.0.1
net.Conn
TCP连接发送HTTP请求并读取后续响应,但在读取时,我似乎从未从连接接收到EOF
。这使得像io.Copy
或ioutil.ReadAll
这样的函数变得无用,因为它们会永远阻塞
代码:
client.go
const requestString=“GET/test HTTP/1.1\r\n”+“主机:127.0.0.1:8080\r\n\r\n”
func main(){
拨号器:=net.dialer{}
conn,err:=拨号器拨号(“tcp”,“127.0.0.1:8080”)
如果错误!=零{
log.Fatalln(错误)
}
延迟连接关闭()
_,err=conn.Write([]字节(请求字符串))
如果错误!=零{
log.Fatalln(错误)
}
buf:=make([]字节,1024)
数据:=生成([]字节,0)
长度:=0
为了{
n、 错误:=conn.Read(buf)
如果错误!=零{
如果错误!=io.EOF{
fmt.Printf(“读取错误:%v\n”,错误)
}
打破
}
数据=追加(数据,buf[:n]…)
长度+=n
fmt.Printf(“部分读取:\n%s\n”,字符串(buf[:n]))
}
fmt.Println(“响应:”)
fmt.Println(字符串(数据))
}
server.go
func main(){
http.HandleFunc(“/”,func(w http.ResponseWriter,r*http.Request){
fmt.Fprintf(w,“Hello,%s”,r.URL.Path[1:])
})
http.listendServe(“:8080”,无)
}
运行客户端.go
和服务器.go
的输出已在运行:
Partial read:
HTTP/1.1 200 OK
Date: Wed, 25 Nov 2020 04:09:32 GMT
Content-Length: 11
Content-Type: text/plain; charset=utf-8
Hello, test
对Read()
的第一个调用返回预期的响应,但缺少EOF
。对Read()
的后续调用将永远挂起,我不确定如何确定连接何时完成。如果中断服务器进程,客户端连接将正确关闭,响应完成
我如何才能a)接收
EOF
或b)确定响应何时完成?我在网上看到的所有示例都与我的代码工作原理相近,因此我不确定我做错了什么。向请求头添加Connection:close
,确保连接。。。好的,关闭。客户端正在等待服务器关闭连接。有两种可能的修复方法1)添加请求头连接:关闭以强制服务器在写入响应后关闭连接2)读取响应内容长度头中指定的字节数或读取分块编码中的最后一个分块后退出。无关:读取响应正文的应用程序代码可以替换为数据,err:=ioutil.ReadAll(conn)
连接:关闭
解决了问题。谢谢你注意到我的错误。