已经习惯了一段时间,但无法找到任何直接回答此问题的内容。
可以使用相同的处理程序处理WS连接和HTTP连接吗?
简而言之,我想复制一些像SignalR
这样的东西答案 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增长。