我想将客户端websocket连接存储到wsList
,并以统一方式发送响应。但它将返回“使用封闭网络连接”。怎么解决?
import {
"code.google.com/p/go.net/websocket"
...
}
var wsList []*websocket.Conn
func WShandler(ws *websocket.Conn) {
wsList = append(wsList, ws)
go sendmsg()
}
func sendmsg() {
for _, conn := range wsList {
if err := websocket.JSON.Send(conn, outmsg); err != nil {
fmt.Printf("%s", err) //"use of closed network connection"
}
}
}
答案 0 :(得分:3)
ws
返回时,关联WsHandler
已关闭。要解决此问题,请通过循环读取消息来阻止WsHandler
返回,直到检测到错误:
func WShandler(ws *websocket.Conn) {
wsList = append(wsList, ws)
go sendmsg()
for {
var s string
if err := websocket.Message.Receive(ws, &s); err != nil {
break
}
}
// remove ws from wsList here
}
wsList上有一场比赛。用互斥锁保护它。
答案 1 :(得分:2)
您不能简单地假设所有连接都无限期保持打开状态,因为另一端可能会随意关闭它们,或者可能会发生网络中断,从而迫使它们关闭。
当您尝试读取或写入已关闭的连接时,会出现错误
"use of closed network connection"
您应该放弃已关闭的连接。