应用终止后,Websocket连接未关闭

时间:2019-08-03 04:03:45

标签: android websocket

应用关闭后,我的Websocket客户端(OkHttp)没有关闭连接。每当我打开应用程序时,它都会打开一个新的连接,这会使该应用程序遭受到来自广播服务器的新旧Websocket连接上收到的多条消息的困扰。

对于Android客户端来说,这是我的正常行为,就像我在Web客户端上遇到的情况一样,在选项卡被杀死后,会话已正确关闭了吗?

我一直在互联网上查找问题,但到目前为止还没有运气。我想确定是由于我的错误代码逻辑还是因为库中Websocket的错误实现而发生了?

这是我在主活动中开始新的Websocket会话的方法

var request: Request = Request.Builder()
            .url("ws://$serverIP:8080/example/sim/speed")
            .build()
        var webSocketListener: WebSocketListener = object : WebSocketListener() {

            override fun callback(msg: Message) {
                updateSpeed(msg.content)
            }

            override fun onClosing(webSocket: WebSocket?, code: Int, reason: String?) {
                super.onClosing(webSocket, code, reason)
            }
        }

        var webSocket = client!!.newWebSocket(request, webSocketListener)

之后,updateSpeed()将更新UIThread上的文本视图

应用程序关闭时,不会触发onClosed事件,只有在手动调用close函数时才会触发。

我确定每次都会打开一个新的套接字,因为我可以看到服务器上使用不同端口创建的新会话。

我想要的是让应用在关闭之前关闭其连接。

谢谢

1 个答案:

答案 0 :(得分:1)

我也遇到了这个问题,在我的应用被杀死后,WebSocket仍然打开。

要解决此问题,我手动关闭套接字并删除所有空闲连接:

fun clear() {
    webSocket?.close(1001, "Android: User exited the game.")
    webSocket = null
    subs.clear()
    subs.add(Completable.fromAction {
        client.connectionPool.evictAll()
    }.subscribeOn(Schedulers.io()).subscribe({}, {}))
}

我基本上在活动(即活动)中调用clear(),这可能会在应用终止时打开。

override fun onDestroy() {
    super.onDestroy()
    App.webSocketClient().clear()
}

这不是理想的解决方案,但每次都能奏效。