【问题标题】:Websocket connection wasn't closed after the app killed应用程序终止后 Websocket 连接未关闭
【发布时间】:2019-12-11 14:32:49
【问题描述】:

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

对于 android 客户端来说,这是正常的行为吗,至于我在 web 客户端上的经历,在标签被杀死后会话被正确关闭了吗?

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

这是我在主 Activity 中启动新 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函数时触发。

我确信它每次都会打开一个新套接字,因为我可以看到在服务器上创建了具有不同端口的新会话。

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

谢谢

【问题讨论】:

  • 当一端的进程退出时,您无法通过连接接收任何内容。您的代码中有一个错误,可能有几个错误,并且在服务器端。
  • @user207421,关键是在这种情况下进程仍在运行。所以当应用退出时连接应该被终止,你说的对吗?

标签: android websocket


【解决方案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({}, {}))
}

我基本上在活动/ies 内部调用clear(),这可能会在应用程序终止期间打开。

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

不是一个理想的解决方案,但每次都有效。

【讨论】:

    猜你喜欢
    • 2012-08-08
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 2016-08-01
    • 2021-11-11
    • 2018-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多