当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何保持golang.org/x/net/websocket打开?》经验,为你挑选了2个好方法。

我天真地使用_,错误:= ws.Read(msg)来保持我的代码中的Web套接字打开.我觉得它不可靠.

在其他代码中,我注意到人们正在进行睡眠循环.保持Web套接字开放和稳定的正确方法是什么?我假设底层库执行ping/pongs?

更新:我非常有信心client.go应该责备,因为在服务器上看到断开连接后似乎没有重拨.我制作了一个视频来展示这个问题.



1> Uvelichitel..:

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
           }
       }
    }()



2> Datsik..:

我误读了你原来的问题.

不,你马上就做了.您基本上需要阻止处理程序返回以保持websocket连接活动.如果您不关心该消息,请丢弃它并对其执行任何操作.

一种常见的方式人们做的是有一个专门的ReadWrite够程,是这样的:

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
}

推荐阅读
雨天是最美
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有