亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

客戶端關閉連接時,Go http.ResponseWriter.Write 不返回錯誤

客戶端關閉連接時,Go http.ResponseWriter.Write 不返回錯誤

滄海一幻覺 2022-06-06 15:52:45
我編寫了一個簡單的 http HandleFunc,需要 2 秒來處理,然后我向服務器發送一個超時 1 秒的請求。我希望調用 ResponseWriter.Write 會返回一個錯誤,但它不會。請為我解釋一下。服務器代碼:import (    "log"    "net/http"    "time")func main() {    log.SetFlags(log.Ltime | log.Lshortfile)    handler := http.NewServeMux()    handler.HandleFunc("/long-task",        func(w http.ResponseWriter, r *http.Request) {            go func() {                <-r.Context().Done()                log.Println("client closed or server responded")            }()            log.Println("handling long-task")            time.Sleep(2 * time.Second)            n, err := w.Write([]byte("my slow response"))            if err != nil {                log.Println("error when ResponseWriter Write: ", err)            }            log.Printf("responded to long-task. n: %v\n", n)        })    server := &http.Server{Addr: ":8008", Handler: handler}    log.Println("listening on port ", server.Addr)    err := server.ListenAndServe()    if err != nil {        log.Fatal(err)    }}客戶端代碼:package mainimport (    "io/ioutil"    "log"    "net/http"    "time")func main() {    client := http.Client{Timeout: 1 * time.Second}    r, _ := http.NewRequest("GET", "http://127.0.0.1:8008/long-task", nil)    w, err := client.Do(r)    if err != nil {        log.Fatal(err)    }    defer w.Body.Close()    body, err := ioutil.ReadAll(w.Body)    if err != nil {        log.Fatal(err)    }    log.Printf("response: %s\n", body)}服務器輸出:10:50:58 http_server.go:28: listening on port  :800810:51:01 http_server.go:19: handling long-task10:51:02 http_server.go:17: client closed or server responded10:51:03 http_server.go:25: responded to long-task. n: 16客戶端輸出:2020/05/27 10:51:02 Get "http://127.0.0.1:8008/long-task": context deadline exceeded (Client.Timeout exceeded while awaiting headers)
查看完整描述

1 回答

?
largeQ

TA貢獻2039條經驗 獲得超8個贊

寫入的數據太少,ResponseWriter 沒有將緩沖的數據發送給客戶端。


    handler.HandleFunc("/long-task", func(w http.ResponseWriter, r *http.Request) {

        go func() {

            <-r.Context().Done()

            log.Println("client closed or server responded")

        }()

        log.Println("handling long-task")

        time.Sleep(2 * time.Second)

        for i := 0; i < 520; i++ {

            _, err := w.Write([]byte("my slow response"))

            if err != nil {

                log.Println("error when ResponseWriter Write: ", err, i)

            }

        }

        // log.Printf("responded to long-task. n: %v\n", n)

    })

輸出:


13:53:19 01.go:30: listening on port  :8008

13:53:22 01.go:18: handling long-task

13:53:23 01.go:16: client closed or server responded

13:53:24 01.go:23: error when ResponseWriter Write:  write tcp 127.0.0.1:8008->127.0.0.1:57098: write: broken pipe 512

13:53:24 01.go:23: error when ResponseWriter Write:  write tcp 127.0.0.1:8008->127.0.0.1:57098: write: broken pipe 513

13:53:24 01.go:23: error when ResponseWriter Write:  write tcp 127.0.0.1:8008->127.0.0.1:57098: write: broken pipe 514

13:53:24 01.go:23: error when ResponseWriter Write:  write tcp 127.0.0.1:8008->127.0.0.1:57098: write: broken pipe 515

13:53:24 01.go:23: error when ResponseWriter Write:  write tcp 127.0.0.1:8008->127.0.0.1:57098: write: broken pipe 516

13:53:24 01.go:23: error when ResponseWriter Write:  write tcp 127.0.0.1:8008->127.0.0.1:57098: write: broken pipe 517

13:53:24 01.go:23: error when ResponseWriter Write:  write tcp 127.0.0.1:8008->127.0.0.1:57098: write: broken pipe 518

13:53:24 01.go:23: error when ResponseWriter Write:  write tcp 127.0.0.1:8008->127.0.0.1:57098: write: broken pipe 519



查看完整回答
反對 回復 2022-06-06
  • 1 回答
  • 0 關注
  • 263 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號