Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Http net.Conn从未收到EOF_Http_Go_Tcp - Fatal编程技术网

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)
连接:关闭
解决了问题。谢谢你注意到我的错误。