Golang websocket nil内存错误

时间:2016-02-02 06:37:50

标签: go websocket

以下是我的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服务器以避免这种情况。

如何避免这种问题?

1 个答案:

答案 0 :(得分:1)

间隔ping websocket连接是正常的事情,请检查它在Gorilla Websocket Chat Example中是如何完成的。我知道你正在使用net/websocket,但这个想法应该是相似的。问题是您无法依赖长时间的TCP连接保持活动状态,尤其是在公共网络中。有些防火墙在一段时间后静默RST连接而没有流量。