使用net / http Go库创建HTTP / 2客户端和服务器程序,以流式传输客户端和服务器请求响应。取自代码https://github.com/golang/go/issues/13444#issuecomment-161115822。
服务器代码
func handle_stream_request(w http.ResponseWriter, r *http.Request) {
buf := make([]byte, 1024)
i := 0
for {
i = i + 1
if i == 10 {
break
}
len, _ := r.Body.Read(buf)
response_str := "Server ACK for: " + string(buf[:len])
w.Write([]byte(response_str))
if f, ok := w.(http.Flusher); ok {
f.Flush()
}
}
}
客户代码
func send_stream_request(client *http.Client) {
pr, pw := io.Pipe()
req, _ := http.NewRequest("PUT", "https://localhost:8000/", ioutil.NopCloser(pr))
var res *http.Response
go func() {
for {
time.Sleep(2 * time.Second)
s := "Client ping@" + get_time()
pw.Write([]byte(s))
if res != nil {
buf := make([]byte, 1024)
len, _ := res.Body.Read(buf)
log.Printf("Response is: %s", string(buf[:len]))
}
}
}()
go func() {
response, _ := client.Do(req)
res = response
log.Printf("\n Got: %#v", res)
}()
select {}
}
您期望看到什么?
客户端发出10个请求后,客户端程序应成功退出。
您看到了什么?
在服务器完成句柄功能后,由于没有读取器读取管道上的数据,因此客户端程序在管道“ pw.Write([] byte(s))”处写入阻塞。
我无法理解如何停止此类客户端程序的挂起。服务器向客户端发送的请求流已关闭的信号是什么,它不应尝试在管道上写入更多内容。