go - Go websocket错误:关闭1006(异常关闭):意外EOF
问题描述
我正在尝试使用 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)
}
}
}
})
该_, msg, err := conn.ReadMessage()
行抛出错误并关闭 websocket,但我不知道为什么。
错误是close 1006 (abnormal closure): unexpected EOF
。我怎样才能防止这种情况?
解决方案
该错误表明对等方关闭了连接而没有发送关闭消息。RFC 将此称为“异常关闭”,但接收到的错误是正常的。
使用IsUnexpectedCloseError过滤掉预期的关闭错误。大猩猩聊天示例展示了如何使用该功能(在此处查看代码)。
clients
正如 Adrian 所指出的,问题中的应用程序存在数据竞争。Gorilla 聊天示例展示了如何在没有数据竞争(集线器)的情况下维护客户端地图。
推荐阅读
- reactjs - 错误:使用 Next.js 默认加载器的图像优化与“下一个导出”不兼容
- c++ - CodeSignal:c ++超出了执行时间限制
- javascript - 在 Javascript 中重用函数调用 [数据将重复孪生]
- java - 如果我关闭 Scanner,我是否必须关闭 FileInputStream
- github - 使用其他组织的操作
- android - 在 Android 应用上未检测到 Firebase 性能 SDK
- reactjs - 在单个 reducer 中调度多个动作或监听多个动作
- vue.js - 如何像这样定义 v-data-table 的页脚?
- dataweave - 如何在dataweave中减去两个数组
- java - ComponentScan 是否在我的 SpringMVC 项目中工作?