【问题标题】:How to correctly close acitivity with active socket connection?如何正确关闭活动套接字连接的活动?
【发布时间】:2012-10-11 09:20:28
【问题描述】:

我有一个始终处于活动状态的套接字连接的 android 应用程序。如果连接丢失,应用程序会立即重新连接到服务器。 套接字在单独的线程中运行。

我可以在不同的情况下正确关闭套接字。例如,当屏幕关闭或按下返回按钮时。

我试图用这个覆盖 onPause、onResume、onDestroy:

我可以在不同的情况下正确关闭套接字。例如,当屏幕关闭或按下返回按钮时。

我试图覆盖 onPause、onResume、onDestroy。这三种方法我都试过了,

显式关闭套接字:

socket.close();

只是将其归零:

socket = null;

而且我也试过shutdownInput方法:

socket.shutdownInput();

但服务器继续认为套接字是活动的。

P.S.:顺便说一下,当我重新编译并再次运行 android 应用程序时,连接断开良好。

【问题讨论】:

  • 上面的代码怎么不崩溃也不抛出异常呢?我的意思是,您正在对一个空对象调用 shutdownInput 方法。
  • selbie,这 3 行代码当然不能一起工作。我刚刚提到了我的尝试。 3 行 = 3 次不同的尝试
  • 哦,我明白了。这是完全不明显的。像上面那样的单个代码块通常在 SO 上被解释为表示您尝试过的实际代码路径。让我为你编辑你的问题。
  • 我实际上不是 Java 专家 - 所以我会阻止发布答案。但是 socket.close() 几乎可以肯定是正确的调用方法。也许错误在服务器上?或者当 android 暂停您的应用程序时,没有发送未发送的待处理关闭?我对此表示怀疑,但如果您可以运行嗅探器以查看是否发送了 FIN,您可以确认这是客户端错误还是服务器错误。

标签: java android sockets


【解决方案1】:

在处理套接字时,您所描述的似乎是common issue;即,即使您可能正确关闭了客户端(即在您的 Android 应用程序中)的套接字,您的服务器也不知道这一点,这就是 可能原因它仍然认为套接字是活动的。

【讨论】:

    【解决方案2】:

    你也应该让服务器关闭套接字。如果您不这样做,服务器将相信客户端服务器仍处于打开状态,直到服务器尝试写入/读取尝试。

    我建议检查客户端-服务器协议:您应该从服务器读取一些可能被解释为关闭请求的“命令”;然后服务器也可以关闭套接字。服务器端这样的东西应该可以帮助你

    1 - 服务器创建监听套接字

    2 - 服务器accept()

    3 - 以下:

    while( readClientCommand() !=CLOSE_COMMAND)
    
       // process command
    

    4 - socket.close();

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-10
      • 1970-01-01
      相关资源
      最近更新 更多