Android:HttpURLConnection不会断开连接

Dan*_*e B 6 android netstat keep-alive httpurlconnection

通过运行netstat在服务器上:
直到前几天我可以看到连接是ESTABLISHED只有大约一秒钟,然后它会从列表中消失
NOW:它保持为ESTABLISHED约10秒钟,然后进入FIN_WAIT1FIN_WAIT2

Android代码是一样的,服务器仍然是一样的

某种Android更新可能会改变一些事情吗?

我无法解释它.

我报告下面的代码.该urlConnection.disconnect()被执行,但连接保持在服务器上建立的.

    HttpURLConnection urlConnection = null;
    System.setProperty("http.keepAlive", "false");

    try {
        URL url = new URL(stringUrl);
        urlConnection = (HttpURLConnection) url.openConnection();
        InputStream instream = new BufferedInputStream(urlConnection.getInputStream());
        ...
        instream.close();
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (urlConnection!=null) {
            urlConnection.disconnect();
        }
    }
Run Code Online (Sandbox Code Playgroud)

nKn*_*nKn 0

根据TCP协议的工作原理,当您关闭连接时,它不会自动从套接字列表中消失。

向另一部分发送终止信号时,就会启动一个协议(更像是一个过程),其中第一步正是您关闭连接的意图。您向另一个节点发送信号,这将涉及FIN_WAIT1状态。

当用户收到该信号后,下一步是从远程端确认该信号。这意味着对面的服务器会向您发送另一个信号,表示该节点也已准备好关闭连接。这就是FIN_WAIT2现状。

在这两个步骤之间,可能会发生远程节点尚未响应的情况(因此您没有被确认要关闭连接)。那时,您将处于称为“恢复”的中间状态CLOSE_WAIT(恢复:一旦您将FIN信号发送到远程服务器并且它们尚未响应)。

TIME_WAIT状态意味着您在明确关闭服务器以接收一些数据包之前给服务器一些优雅的时间。您这样做是因为可能会发生连接异常,并且远程服务器可能尚未收到“断开连接”消息并向您发送一些数据包。因此,当发生这种情况时,您不必在两个节点之间创建一个新套接字,而是将其与该状态中的套接字关联起来TIME_WAIT,然后简单地丢弃该数据包,因为序列号可能不会被排序。

您可能会看到其他一些状态,但根据您描述的方式,这对我来说似乎很正常,除非当您调用该.disconnect()方法时,该ESTABLISHED状态会持续。在这种情况下,某些东西无法按预期工作(它可能与某种重载或未优化的代码有关,这可能会使您的执行速度非常慢)。


归档时间:

查看次数:

2692 次

最近记录:

11 年,6 月 前