下面是我的websocket服务器的代码。
http.Handle("/gatewayconnector", websocket.Handler(socketHandler))
方法套接字处理程序具有以下代码:
func socketHandler(ws *websocket.Conn) {
LoadClient(ws)
var msg []byte
for {
if err := websocket.Message.Receive(ws, &msg); err != nil {
log.Error("Error in socketHandler: ", err)
break
}
validateMessage(msg)
}
}
当客户端发生握手时,将调用套接字处理程序回调方法,并且它还启动 websocket 对象。因此,在此方法的第一步中,我将这个 websocket 对象存储到一个数组中,以便我可以在发送方法调用(用于向客户端发送消息)中检索它。
问题是有时我在 ws 中得到零内存引用,即在尝试向客户端发送一些消息时 websocket。
下面是发送方法代码:
func Send(msg interface{}) error {
ws := webSocketClients[0]
if (ws == nil) {
log.Error("Websocket connection is nil, gateway should initiate the connection.")
}
return websocket.JSON.Send(ws, msg)
}
当 websocket 连接 remanis 空闲时间较长并且我直接调用 send 方法时,会出现此问题。
现在我已经设置了一个黑客,客户端将定期ping我的websocket服务器以避免这种情况。
如何避免这种问题?
按间隔 ping websocket 连接是正常的事情,请在大猩猩 Websocket 聊天示例中检查它是如何完成的。我知道你正在使用net/websocket
,但想法应该是相似的。问题是你不能指望你的长期TCP连接将保持活动状态,特别是在公共网络中。某些防火墙会在一段时间后静默地 RST 连接,而不会产生流量。