我天真地使用_,错误:= 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
够程,是这样的:
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 }