golang http服务器不接受发布大数据

时间:2016-07-21 20:18:37

标签: http go large-files

目前尝试使用golang http服务器并从以下代码编译:

    package main

import (
    "io"
    "net/http"
    "time"
)

func hello(w http.ResponseWriter, r *http.Request) {
    r.ParseForm()
    io.WriteString(w, "Hello world!")
}

var mux map[string]func(http.ResponseWriter, *http.Request)

func main() {
    server := http.Server{
        Addr:           ":8000",
        MaxHeaderBytes: 30000000,
        ReadTimeout:    10 * time.Second,
        WriteTimeout:   10 * time.Second,
        Handler:        &myHandler{},
    }

    mux = make(map[string]func(http.ResponseWriter, *http.Request))
    mux["/"] = hello

    server.ListenAndServe()
}

type myHandler struct{}

func (*myHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    if h, ok := mux[r.URL.String()]; ok {
        h(w, r)
        return
    }

    io.WriteString(w, "My server: "+r.URL.String())
}

运行它并通过Apache Bench发送测试数据

ab.exe -c 30 -n 1000 -p ESServer.exe -T application/octet-stream http://localhost:8000/ 

它的小文件工作非常好,但ESServer.exe的大小为8Mb,我接收到下一个错误" apr_socket_recv:远程主机强行关闭现有连接。 (730054)"

可能会出现什么问题?

1 个答案:

答案 0 :(得分:1)

您没有读取请求正文,因此每次填充所有缓冲区后,每个请求都将被阻止。您始终需要完整地读取请求或强行断开客户端以避免请求挂起和消耗资源。

至少,你可以

io.Copy(ioutil.Discard, r.Body)