用在win上用telnet测试发现连接可以长达10分钟保持不断,再次输入http请求仍然可以响应,实际上可不止10分钟,因为我只测试了10分钟,这种长连接会在某些情况下导致服务器问题。怎样强行中断连接?
在数据量大的时候也是以Transfer-Encoding: chunked传输的,实际上下面的代码数据量并不大,w.Write([]byte("hehe"))却又不是chunked。 如果我们的程序不支持chunked响应,要怎么办?
package main
import (
"encoding/json"
"fmt"
"log"
"net/http"
"os"
)
func getData() []byte {
var data = map[string]interface{}{
"args": os.Args,
"env": os.Environ(),
}
bts, err := json.MarshalIndent(data, "", " ")
if err != nil {
panic(err)
}
return bts
}
/*
telnet测试
GET / HTTP/1.1
Host: 192.168.58.142:8888
Connection: keep-alive
*/
func main() {
// 此代码在telnet中是长连接的
// 因为没有设置内容长度,传输会变成 Transfer-Encoding: chunked
http.HandleFunc("/1", func(w http.ResponseWriter, r *http.Request) {
w.Write(getData())
})
// 强行关闭长连接
http.HandleFunc("/2", func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Connection", "close")
w.Write(getData())
})
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
bts := getData()
// 因为设置了content-length,所以不再是 Transfer-Encoding: chunked
// 响应头content-length会自动转换为规范的大小写
w.Header().Set("ContenT-LeNgth", fmt.Sprintf("%d", len(bts)))
w.Write(bts)
})
log.Fatal(http.ListenAndServe(":8888", nil))
}