使用相同的处理程序处理 websocket 和 HTTP



已经搜索了一段时间,但找不到任何直接回答这个问题的东西。

Go 可以使用相同的处理程序处理 WS 连接和 HTTP 连接吗?

简而言之,我想复制类似SignalR的东西

是的,gorilla/websocket 包支持在请求处理程序中从 HTTP 升级到 WebSocket。请参阅包文档开头的示例。函数 handler 是一个标准的 HTTP 请求处理程序。对upgrader.Upgrade的调用将切换到 WebSocket 协议的连接。

x/net/websocket 包需要一个单独的处理程序。您可能不想使用 x/net/websocket 软件包还有其他原因。

我最终需要在将请求传递给方法之前自己过滤请求upgrader.upgrade。因为upgrader.upgrade,在升级请求失败时,写下"错误请求"响应。将我的 HTML 呈现为纯文本的东西,并在开始时带有额外的"错误请求"文本。

所以这就是我在handler顶部所做的:

func singleHandler(w http.ResponseWriter, r *http.Request) {
    upgrade := false
    for _, header := range r.Header["Upgrade"] {
        if header == "websocket" {
            upgrade = true
            break
        }
    }
    if upgrade == false {
        if r.Method != "GET" {
            http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
            return
        }
        if r.URL.Path != "/" {
            http.NotFound(w, r)
            return
        }
        chatTemplate.Execute(w, listenAddr)
        return
    }
    c, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        log.Print("Upgrade err:", err)
        return
    }
    ...
}

下面是一个示例存储库:https://github.com/siriusdely/gochat。基于Andrew Gerrand的演讲:代码与优雅 https://talks.golang.org/2012/chat.slide#44 一起成长。

相关内容

  • 没有找到相关文章

最新更新