2016-07-21 2 views
0

В текущем использовании Ьгу времени 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). "

Какая проблема может произойти?

+0

Ваш первый вопрос вы используете AB, который не является даже HTTP/1.1, так что открывает новое соединение для каждого запроса, который не поможет когда у вас заканчиваются дескрипторы файлов или эфемерные порты. Затем ваш мультиплексор небезопасен и будет паниковать при одновременных запросах. – JimB

+0

@jimb ab более чем счастлив сделать keepalive с '-k'. – hobbs

+0

@hobbs: да, но это все еще http/1.0, и пример здесь не использовался '-k';) (плюс HTTP-сервер может превзойти' ab' в этих надуманных микропредметках, поэтому он тестирует 'ab' как так как он тестирует сервер) – JimB

ответ

1

Вы не читаете тело запроса, поэтому каждый запрос блокируется после заполнения всех буферов. Вам всегда нужно полностью прочитать запрос или принудительно отключить клиента, чтобы избежать зависания и потребления ресурсов запроса.

Как минимум, вы можете

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

Спасибо большое ... –

 Смежные вопросы

  • Нет связанных вопросов^_^