В текущем использовании Ьгу времени golang HTTP-сервер и скомпилировать его из этого кода: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 имеет размер 8 Мб, и я получаю следующую ошибку: apr_socket_recv: существующее соединение было принудительно закрыто удаленным хостом. (730054). "
Какая проблема может произойти?
Ваш первый вопрос вы используете AB, который не является даже HTTP/1.1, так что открывает новое соединение для каждого запроса, который не поможет когда у вас заканчиваются дескрипторы файлов или эфемерные порты. Затем ваш мультиплексор небезопасен и будет паниковать при одновременных запросах. – JimB
@jimb ab более чем счастлив сделать keepalive с '-k'. – hobbs
@hobbs: да, но это все еще http/1.0, и пример здесь не использовался '-k';) (плюс HTTP-сервер может превзойти' ab' в этих надуманных микропредметках, поэтому он тестирует 'ab' как так как он тестирует сервер) – JimB