已经搜索了一段时间,但找不到任何直接回答这个问题的东西。
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 一起成长。