首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在go中检测失败的http连接

在go中检测失败的http连接
EN

Stack Overflow用户
提问于 2019-04-28 03:19:24
回答 2查看 1.3K关注 0票数 3

让我们假设客户端通过http上传大量图片,网络连接速度很慢,他打开到服务器的连接,开始写入数据,突然由于网络问题失去了连接。如果处理程序函数尚未调用,我如何在服务器上检测到这一点。我找到的解决方案是检查连接状态。但问题是它不是可伸缩的,因为许多goroutine将与全局变量交互。还有没有更好的解决方案?

代码语言:javascript
复制
package main

import (
    "fmt"
    "log"
    "net"
    "net/http"
)

// current state of connections
var connStates = make(map[string]http.ConnState)

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Println("got new request")
        fmt.Println(connStates)
    })

    srv := &http.Server{
        Addr: ":8080",
        ConnState: func(conn net.Conn, event http.ConnState) {
            if event != http.StateClosed {
                connStates[conn.RemoteAddr().String()] = event
            } else {
                if connStates[conn.RemoteAddr().String()] == http.StateActive {
                    fmt.Println("client cancelled request")
                }
                delete(connStates, conn.RemoteAddr().String())
            }
        },
    }
    log.Fatal(srv.ListenAndServe())
}
EN

回答 2

Stack Overflow用户

发布于 2019-04-29 20:16:45

您可以在处理程序中使用context,例如,这将检测客户端何时断开连接并返回以及 http.StatusPartialContent除了在您可以拥有日志记录逻辑的地方调用 someCleanup() 之外。

https://play.golang.org/p/5Yr_HBuyiZW

代码语言:javascript
复制
func helloWorld(w http.ResponseWriter, r *http.Request) {
    ctx := r.Context()

    ch := make(chan struct{})

    go func() {
            time.Sleep(5 * time.Second)
            fmt.Fprintln(w, "Hello World!")
            ch <- struct{}{}
    }()

    select {
    case <-ch:
    case <-ctx.Done():
            http.Error(w, ctx.Err().Error(), http.StatusPartialContent)
            someCleanUP()
    }

}

票数 1
EN

Stack Overflow用户

发布于 2019-04-29 19:12:13

如果你只需要日志,你甚至可以简化代码:

代码语言:javascript
复制
srv := &http.Server{
        Addr: ":8080",
        ConnState: func(conn net.Conn, event http.ConnState) {
            log.Printf("addr: %s, changed state to: %s", conn.RemoteAddr(), event.String())
        },
    }

该回调将在conn的每次更改时触发

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55884054

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档