http - net.Conn 从未收到 EOF
问题描述
我正在尝试通过 TCP 连接发送 HTTP 请求net.Conn
并读取后续响应,但在读取时我似乎从未收到EOF
来自连接的响应。这使得函数像io.Copy
或ioutil.ReadAll
无用,因为它们永远阻塞。
代码:
client.go
const requestString = "GET /test HTTP/1.1\r\n" + "Host: 127.0.0.1:8080\r\n\r\n"
func main() {
dialer := net.Dialer{}
conn, err := dialer.Dial("tcp", "127.0.0.1:8080")
if err != nil {
log.Fatalln(err)
}
defer conn.Close()
_, err = conn.Write([]byte(requestString))
if err != nil {
log.Fatalln(err)
}
buf := make([]byte, 1024)
data := make([]byte, 0)
length := 0
for {
n, err := conn.Read(buf)
if err != nil {
if err != io.EOF {
fmt.Printf("Read error: %v\n", err)
}
break
}
data = append(data, buf[:n]...)
length += n
fmt.Printf("Partial read:\n%s\n", string(buf[:n]))
}
fmt.Println("Response:")
fmt.Println(string(data))
}
server.go
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, %s", r.URL.Path[1:])
})
http.ListenAndServe(":8080", nil)
}
client.go
已经运行的运行输出server.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
到请求标头可确保连接......好吧,关闭。
推荐阅读
- vue.js - 获取 Vue 插槽内每个组件的索引
- python - 使用条件从 np 数组中删除元素的最有效方法
- python - 如何在 Python 环境中测试目标代码。输入首选测试用例
- automation - 在詹金斯中发送了 ping 但在 1000 毫秒内没有收到 pong
- javascript - 如何在本机反应中绑定远程javascript文件?
- python - 将列表与新行 CSV 中的每个值一起保存
- ruby - 如何使用 msgraph-sdk-ruby 将成员添加到组?
- nginx - 在哪里可以找到为 nginx.ingress.kubernetes.io/affinity 注释生成的配置
- python - 如何在 python 中将`str`对象转换为`datetime`对象
- sh - 如何通过 SSH 执行源(点)命令?