如何保持golang.org/x/net/websocket打开?

时间:2016-01-04 12:23:19

标签: go websocket

我天真地使用_, err := ws.Read(msg)在我的代码中打开Web套接字。我认为它不可靠。

在其他代码中,我注意到有人在做sleep loop。什么是保持Web套件打开的正确方法&稳定?我假设底层库执行ping / pongs?

更新:我非常有信心client.go应该受到指责,因为在服务器上看到断开连接后它似乎没有重拨。我做了a video demonstrating the issue

2 个答案:

答案 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连接活动。如果你不关心这个消息,那就放弃它,不做任何事情。

人们常用的方法是拥有专用的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
}