如何在GO的WebSocket中保持连接活跃

我在服务器中使用 code.google.com/p/go.net/websocket </ code> ,因此客户端可以从服务器获取通知。 </ p>

但是,似乎客户端连接到服务器后,如果客户端和服务器之间没有任何数据传输,服务器将在 websocket.JSON.Receive()<上返回EOF错误。 / code>,它看起来像一个超时机制。 </ p>

我在Google中进行了搜索,看来websocket协议具有乒乓</ strong>心跳来维持连接,我想问一下 code。 google.com/p/go.net/websocket </ code>是否支持此ping协议?

如果要保持客户端与服务器之间的连接正常,该怎么办? </ p>
</ div>

展开原文

原文

I use code.google.com/p/go.net/websocket in server, so client can get notification from server.

however, It seems after client connected to server, if there is no any data tranfer between client and server, server will return EOF error at websocket.JSON.Receive(), it looks like a timeout mechanism.

And I have search in Google, it seems websocket protocol has a ping-pong heartbeat to maintain the connection, I want to ask whether code.google.com/p/go.net/websocket support this ping protocol or not?
What should I do if I want keep connection between client and server alive?

dtbonklcs575884485
dtbonklcs575884485 请为websocket处理程序发布您的执行代码。可能您只需要添加一个for循环即可
大约 6 年之前 回复

2个回答



直到2013年,go.net网络套接字库不支持(自动)保持活动状态消息。 您有两个选择:</ p>


  • 通过定期让您的应用程序沿管道发送消息来实现“应用程序级别”保持活动(任一方向都应起作用),即 被另一边忽略。</ li>
  • 移至不支持保持活动的其他Websocket库(像这样编辑:</ strong>看来该库已被大猩猩websockets 。</ li>
    </ ul>
    </ div>

展开原文

原文

As recently as 2013, the go.net websocket library does not support (automatic) keep-alive messages. You have two options:

  • Implement an "application level" keep-alive by periodically having your application send a message down the pipe (either direction should work), that is ignored by the other side.
  • Move to a different websocket library that does support keep-alives (like this one) Edit: it looks like that library has been superseded by Gorilla websockets.

douqiang7976
douqiang7976 这可能值得一个新的SO问题。
大约 6 年之前 回复
douchen4915
douchen4915 如果自行实施,保持生命的时间是多长?
大约 6 年之前 回复

Here's working drop-in solution for gorilla/websocket package.

func keepAlive(c *websocket.Conn, timeout time.Duration) {
    lastResponse := time.Now()
    c.SetPongHandler(func(msg string) error {
       lastResponse = time.Now()
       return nil
   })

   go func() {
     for {
        err := c.WriteMessage(websocket.PingMessage, []byte("keepalive"))
        if err != nil {
            return 
        }   
        time.Sleep(timeout/2)
        if(time.Now().Sub(lastResponse) > timeout) {
            c.Close()
            return
        }
    }
  }()
}
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐