我正在尝试使用 gorilla/websocket 编写一个简单的 go websocket 服务器
http.HandleFunc("/ws", func(w http.ResponseWriter, r *http.Request) {
if os.Getenv("env") == "development" {
upgrader.CheckOrigin = func(r *http.Request) bool { return true }
}
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Printf("Websocket error: %s", err)
return
}
defer conn.Close()
// Register client
clients[conn] = true
for {
message := message.Message{}
_, msg, err := conn.ReadMessage()
if err != nil {
log.Printf("Websocket error: %s", err)
return
}
res, _ = json.Marshal(context.Game)
// Send to every client that is currently connected
for client := range clients {
err := client.WriteMessage(websocket.TextMessage, res)
if err != nil {
// Remove connection
client.Close()
delete(clients, client)
}
}
}
})
Run Code Online (Sandbox Code Playgroud)
该_, msg, err := conn.ReadMessage()行抛出错误并关闭 websocket,但我不确定为什么。
错误是close 1006 (abnormal closure): unexpected EOF。我怎样才能防止这种情况发生?
Cer*_*món 11
该错误表明对等方在未发送关闭消息的情况下关闭了连接。RFC 称此为“异常关闭”,但接收该错误是正常的。
使用IsUnexpectedCloseError过滤掉预期的关闭错误。Gorilla Chat 示例展示了如何使用该功能(在此处查看代码)。
clients正如阿德里安指出的那样,问题中的应用程序存在数据竞争。Gorilla Chat 示例展示了如何在没有数据争用的情况下维护客户端地图 ( hub )。
| 归档时间: |
|
| 查看次数: |
31124 次 |
| 最近记录: |