如何打开golang.org/x/net/websocket



我天真地使用_,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连接的有效性。如果你不在乎这个消息,就丢弃它,什么都不做。

人们做这件事的一种常见方式是有一个专用的ReadWrite 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
}

相关内容

  • 没有找到相关文章

最新更新