应用程序被杀死后,Websocket连接未关闭。

3
我的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
@user207421,重点是在这种情况下进程仍在运行。所以当应用程序退出时应该终止连接,你说的对吗? - elPsyChris
1个回答

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()
}

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接