【问题标题】:Android - Socket does not close fast enoughAndroid - 套接字关闭速度不够快
【发布时间】:2017-09-13 14:17:24
【问题描述】:

我有一个客户端应用程序和一个服务器应用程序。客户端应用程序通过 java.net.Socket(协议 = TCP)向服务器应用程序发送数据包。在 Socket.Close() 上,我的服务器应用程序立即向我显示连接已关闭 - 这就是它必须正常工作的方式。注意:整个 tcp-streaming 逻辑在辅助活动中,这就是为什么我使用 onBackPressed() 函数来完成整个 tcp-streaming 并切换到主要活动。

工作场景:

@Override
public void onBackPressed(){
      m_socket.Close();
      finish();
}

如前所述,套接字关闭,服务器立即通知连接已关闭。

不工作的场景,因为 Socket.close() 似乎太慢了:

@Override
public void onBackPressed(){
      m_socket.Close();
      m_wifiManager.disconnect();
      finish();
}

此方案仅在 20% 的情况下正常工作。在另外 80% 的情况下,我的服务器应用程序通知连接以 大延迟 关闭。在我看来,这是因为 tcp-socket 需要关闭时间 - 所以进程被 wifi-connection 断开中断,并且无法正确关闭套接字 (#)。作为我观点的证明:如果我逐步调试,这个场景在 100% 的情况下都有效。服务器立即通知。

我已经尝试过什么也不能正常工作:

  • m_wifiManager.disconnect() in onPause()

  • m_wifiManager.disconnect() in onDestroy()

所以我的问题是:

  1. 我的意见 (#) 正确吗?是否没有及时关闭套接字?

  2. 我该如何解决这个问题?这样 tcp-socket-closure 会正确完成,就像在第一个场景中一样,然后 wifi 断开连接?

【问题讨论】:

  • 您向我们展示的是客户端代码还是服务器代码?我假设客户?

标签: java android sockets wifimanager onbackpressed


【解决方案1】:

问题可能与SO_LINGER 套接字选项有关:

指定关闭时延迟超时。此选项禁用/启用从 TCP 套接字的 close() 立即返回。 使用非零整数超时启用此选项意味着 close() 将阻止等待传输和确认写入对等方的所有数据,此时套接字将正常关闭。达到延迟超时后,套接字将通过 TCP RST 强制关闭。启用超时为零的选项会立即强制关闭。如果指定的超时值超过 65,535,它将减少到 65,535。

默认情况下它是禁用的,您的close 调用会立即返回,并且您会在套接字实际关闭之前断开 wifi。您需要致电setSoLinger 进行修复:

m_socket.setSoLinger(true, 1);

【讨论】:

  • 实际上它适用于我正在调试的以下设备:Galaxy Tab A (2016), Android Version 7.0 但对于我正在调试的以下设备,它根本不起作用,甚至一次都不起作用: Galaxy S5, Android Version 6.0.1你知道为什么吗?你有解决办法吗?
  • 在 Galaxy S5 上调试时,我注意到即使是第一个使用 socket.close() 且没有断开 wifi 连接的场景也无法正常工作。 S5 上的问题是 m_socket.setSoLinger(true,1)。添加这一行只会给这两种情况带来很大的延迟......@Oleg你知道为什么吗?
  • @David 尝试将1 更改为0,看看是否能得到更好的结果。如果是这种情况,可能是 android 或供应商错误,您无能为力。尝试在关闭套接字和断开 wifi 之间添加一个小睡眠。
  • 更改为0 的结果。 Galaxy Tab A:场景1每次都有效,场景2(断开wifi)只在第一次有效,然后延迟很大。 Galaxy S5:场景1 每次都有效,场景2 根本不工作,总是延迟很大! “尝试在关闭套接字和断开 wifi 之间添加一个小睡眠。” - @Oleg 我怎样才能以最好的方式实现这个?
  • @David 只需在关闭套接字之后、断开 wifi 之前添加 Thread.sleep(100)(也可以尝试使用不同的数字)。
猜你喜欢
  • 1970-01-01
  • 2011-12-15
  • 1970-01-01
  • 1970-01-01
  • 2013-12-16
  • 2012-10-17
  • 2013-05-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多