繁体   English   中英

Android服务器:为什么它会随机超时传入连接?

[英]Android server: why it times out incoming connections randomly?

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

然而我发现,由于任何原因,即使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设备快速应答传入连接? 否则,任何需要传入流量的应用程序都会出错并且不可靠。

如果设备没有主动使用,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将保持活动状态,但唯一支持的操作是启动扫描,以及随后的扫描结果报告。

希望这可以帮助 :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM