以下是我的websocket服务器的代码。
http.Handle("/gatewayconnector", websocket.Handler(socketHandler))
方法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对象存储到一个数组中,这样我就可以在send方法调用中检索它(用于向客户端发送消息)。
问题有时我在ws中获得nil内存引用,即在尝试向客户端发送消息时使用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连接重新闲置较长时间并且我直接调用send方法时会出现此问题。
现在我已经放了一个hack,客户端会定期ping我的websocket服务器以避免这种情况。
如何避免这种问题?
答案 0 :(得分:1)
间隔ping websocket连接是正常的事情,请检查它在Gorilla Websocket Chat Example中是如何完成的。我知道你正在使用net/websocket
,但这个想法应该是相似的。问题是您无法依赖长时间的TCP连接保持活动状态,尤其是在公共网络中。有些防火墙在一段时间后静默RST连接而没有流量。