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

时间:2014-12-10 19:30:17

标签: http go websocket

已经习惯了一段时间,但无法找到任何直接回答此问题的内容。

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

简而言之,我想复制一些像SignalR

这样的东西

2 个答案:

答案 0 :(得分:2)

是的,gorilla / websocket包支持在请求处理程序中从HTTP升级到WebSocket。请参阅beginning of the package documentation上的示例。函数handler是标准的HTTP请求处理程序。对upgrader.Upgrade的调用将连接切换到WebSocket协议。

x / net / websocket包需要一个单独的处理程序。有other reasons为什么你可能不想使用x / net / websocket包。

答案 1 :(得分:0)

我最终需要自己过滤请求,然后再将其传递给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增长。