我天真地使用_, err := ws.Read(msg)在我的代码中打开Web套接字。我认为它不可靠。
在其他代码中,我注意到有人在做sleep loop。什么是保持Web套件打开的正确方法&稳定?我假设底层库执行ping / pongs?
更新:我非常有信心client.go应该受到指责,因为在服务器上看到断开连接后它似乎没有重拨。我做了a video demonstrating the issue。
答案 0 :(得分:7)
golang.org/x/net/websocket没有实现RFC 6455的乒乓,但是gorilla websocket implementation没有。 Gorilla websocket的最小例子
c := time.Tick(pingInterval)
go func(){
for _ := range c {
if err := conn.WriteControl(Ping...); err != nil {
handle error
}
}
}()
-----
conn.SetPongHandler(func(string) error { return conn.SetReadDeadline(time.Now().Add(pingInterval)) })
go func(){
for {
if _, _, err := conn.NextReader(); err != nil {
handle error
}
}
}()
答案 1 :(得分:6)
我误解了你原来的问题。
不,你马上就做了。您基本上需要阻止处理程序返回以保持websocket连接活动。如果你不关心这个消息,那就放弃它,不做任何事情。
人们常用的方法是拥有专用的Read
和Write
goroutine,例如:
func fishHandler(ws *websocket.Conn) {
id := ws.RemoteAddr().String() + "-" + ws.Request().RemoteAddr + "-" + ws.Request().UserAgent()
sockets[id] = ws
go writePump(ws)
readPump(ws)
}
func readPump(ws *websocket.Conn) {
defer ws.Close()
msg := make([]byte, 512)
_, err := ws.Read(msg)
if err != nil {
return
}
}
func writePump(ws *websocket.Conn) {
// Hand the write messages here
}