我天真地使用_,err:=ws.Read(msg)来保持代码中的Web套接字打开。我认为它不可靠。
在其他代码中,我注意到有人在做睡眠循环。保持Web套接字打开的正确方法是什么;稳定的我假设底层库执行ping/pongs?
更新:我非常确信client.go是罪魁祸首,因为在服务器上看到断开连接后,它似乎不会重拨。我制作了一个视频来演示这个问题。
golang.org/x/net/websocket没有实现RFC 6455中的乒乓球,但gorilla-websocket实现实现了。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
}
}
}()
我误解了你最初的问题。
不,你马上就做。您基本上需要阻止处理程序返回,以保持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
}