【问题标题】:Android server: why it times out incoming connections randomly?Android服务器:为什么它会随机超时传入连接?
【发布时间】:2017-02-24 09:20:08
【问题描述】:

我必须创建必须侦听传入连接的 Android 服务器应用程序。它是非根应用程序,它侦听随机高端口。代码很简单,在桌面 Java 上运行良好,它只监听端口并实现非常简单的自定义请求/响应协议。

然而我发现,无论出于何种原因,即使是 Android 应用程序现在也在 accept 方法中(即它应该等待传入连接),连接经常超时。

我还发现,有时甚至系统应用程序(例如 ADB 服务器)也会无缘无故地定期超时传入连接。参见例如paping 输出:

paping -p 5555 192.168.0.105
paping v1.5.5 - Copyright (c) 2011 Mike Lovell

Connecting to 192.168.0.105 on TCP 5555:

Connection timed out
Connection timed out
Connection timed out
Connection timed out
Connection timed out
Connection timed out
Connection timed out
Connection timed out
Connection timed out
Connection timed out
Connection timed out
Connection timed out
Connection timed out
Connection timed out
Connection timed out
Connected to 192.168.0.105: time=118.02ms protocol=TCP port=5555
Connected to 192.168.0.105: time=140.02ms protocol=TCP port=5555
Connected to 192.168.0.105: time=57.01ms protocol=TCP port=5555
Connected to 192.168.0.105: time=77.51ms protocol=TCP port=5555
Connected to 192.168.0.105: time=97.01ms protocol=TCP port=5555
Connected to 192.168.0.105: time=122.02ms protocol=TCP port=5555
Connected to 192.168.0.105: time=135.52ms protocol=TCP port=5555
Connected to 192.168.0.105: time=52.01ms protocol=TCP port=5555
Connected to 192.168.0.105: time=72.51ms protocol=TCP port=5555
Connected to 192.168.0.105: time=92.51ms protocol=TCP port=5555
Connected to 192.168.0.105: time=105.51ms protocol=TCP port=5555
Connected to 192.168.0.105: time=5.50ms protocol=TCP port=5555

因此,看起来设备超时了一些传入数据并在此之后开始接受,后来它随机超时。而且 ADB 是系统应用程序,所以它应该遵循任何准则并且相对没有错误。

有谁知道如何解决这个问题并让 Android 设备快速响应传入的连接?否则,任何需要传入流量的应用程序都会出现错误且不可靠。

【问题讨论】:

  • the connection time out often.??哪个连接?服务器在听不是吗?请清理干净。
  • 是的,服务器正在监听,并且出于某种原因,一些传入连接随机超时(根本无法连接),即使 Java 在 accept 方法调用中等待。
  • 你不是在责怪一个有问题的路由器吗?试过其他设备吗?
  • 多年来,我从未在同一本地网络中看到桌面设备有任何问题。

标签: java android sockets serversocket


【解决方案1】:

如果设备未在使用中,Android 操作系统会在一段时间后关闭 Wifi Radio。不过,我不确定它对“使用中”的看法。或许这与它有关...

来自https://developer.android.com/reference/android/net/wifi/WifiManager.WifiLock.html

通常,当用户有一段时间没有使用设备时,Wi-Fi 无线电可能会关闭。

在我的几个应用程序中,我使用了 Wifi Lock 来保持收音机处于唤醒状态。 像这样的东西: 注意:应用程序应该请求 android.permission.WAKE_LOCK

public class MyActivity extends Activity {
     private WifiManager.WifiLock wifiLock;

     @Override
     protected void onResume {
         super.onResume();
         WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
         wifiLock = wifiManager.createWifiLock(WifiManager.WIFI_MODE_FULL_HIGH_PERF, "SYNCVR");
         wifiLock.acquire();
     }

     @Override
     protected void onPause() {
         wifiLock.release();
     }
}

您可以在创建 wifi 锁时指定几个不同的选项: 来自https://developer.android.com/reference/android/net/wifi/WifiManager.html

WIFI_MODE_FULL

在这种 Wi-Fi 锁定模式下,Wi-Fi 将保持活动状态,并且会正常运行,即,它会尝试自动建立与范围内记住的接入点的连接,并且会定期扫描,如果有记住的接入点,但没有一个在范围内。

-

WIFI_MODE_FULL_HIGH_PERF

在这种 Wi-Fi 锁定模式下,Wi-Fi 将像在 WIFI_MODE_FULL 模式下一样保持活动状态,但即使设备屏幕关闭,它也会以高性能运行,丢包率最低且数据包延迟低。

-

WIFI_MODE_SCAN_ONLY

在这种 Wi-Fi 锁定模式下,Wi-Fi 将保持活动状态,但唯一支持的操作是启动扫描以及随后报告扫描结果。

希望这会有所帮助:)

【讨论】:

  • 这并不能解决新传入连接请求超时的问题。当连接已经建立时,当我使用 Wi-Fi 锁定时,连接会变得更加稳定。但是,它不会影响必须建立的新连接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-30
相关资源
最近更新 更多