2016-07-21 10 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のベンチを介してテストデータを送信

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

小さなファイルではうまくいっていますが、ESServer.exeのサイズは8Mbです。次のエラー "apr_socket_recv:リモートホストによって強制的に既存の接続が閉じられました。(730054)"

どのような問題が発生する可能性がありますか?

+0

をすることができますあなたがファイルディスクリプタまたは一時的なポートを使い果たしているとき。次に、あなたのマルチプレクサは安全ではなく、同時リクエストの下でパニックになります。 – JimB

+0

@jimb abは '-k'でキープアライブを行うのが嬉しいです。 – hobbs

+0

@hobbs:はい、それでもhttp/1.0ですが、ここの例では '-k';を使用していませんでした;)(go httpサーバはこれらの考案されたマイクロベンチマークで' ab'よりも優れている可能性があります。サーバをテストしているように) – JimB

答えて

1

あなたはリクエストボディを読んでいないので、すべてのバッファがいっぱいになると各リクエストはブロックされます。要求がぶら下がり、リソースを消費しないようにするには、クライアントを完全に強制的に読み取るか、クライアントを強制的に切断する必要があります。最低で

、あなたはあなたの最初の問題は、あなたも、HTTPではありませんAB、/ 1.1を使用しているので、助けにはなりませんすべての要求のための新しい接続を開いている

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

ありがとうございました... –

関連する問題