我必须创建必须侦听传入连接的Android服务器应用程序。它是非root应用程序,它监听随机高端口。代码很简单,在桌面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设备快速应答传入连接?否则,任何需要传入流量的应用程序都会出错并且不可靠。
答案 0 :(得分:0)
如果设备没有正在使用,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将保持活动状态,但唯一支持的操作是启动扫描,并随后报告扫描结果。
希望这会有所帮助:)