2017-02-24 80 views
1

我不得不创建必须监听传入连接的Android服务器应用程序。它是非根应用程序,它监听随机高端口。代码很简单,并且在桌面Java上非常出色,它只是侦听端口并实现非常简单的自定义请求/响应协议。然而,我发现即使Android应用程序现在都在accept方法(即它应该等待传入连接),但由于任何原因,我经常发现连接超时。Android服务器:为什么它随机超时传入连接?

我发现有时甚至系统应用程序(例如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 

所以,它看起来像设备超时一些输入数据,启动之后接受,后来超时随机。亚行是系统应用程序,所以它应该遵循任何指导原则,并且可以免费使用相同的漏洞。

有谁知道如何解决这个问题并使Android设备能够快速响应传入连接?否则,任何需要传入流量的应用程序都将变得越来越不可靠。

+0

'连接的time out often.'?哪个连接?服务器听着不是吗?请清除。 – greenapps

+0

是的,服务器正在侦听,并且由于某种原因,某些传入连接超时(根本无法连接),即使Java正在“accept”方法调用中等待。 – Vitaliy

+0

你不是在怪车路由器吗?试过其他设备? – greenapps

回答

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(); 
    } 
} 

: 从https://developer.android.com/reference/android/net/wifi/WifiManager.html

WIFI_MODE_FULL

在此Wi-Fi锁定模式下,Wi-Fi将保持活动状态, d将正常表现,即它将尝试自动建立到范围内的记忆接入点的连接,并且如果存在记忆的接入点但是没有在范围内将做定期扫描。

-

WIFI_MODE_FULL_HIGH_PERF

在该无线网络连接的锁定模式,无线网络将保持活跃在模式WIFI_MODE_FULL但它在以最小分组丢失和低分组的大能力运转即使在设备屏幕关闭时也是如此。

-

WIFI_MODE_SCAN_ONLY

在这个Wi-Fi锁定模式,Wi-Fi将保持活跃,但将要支持的唯一操作扫描开始,以及随后报告扫描结果。

希望这有助于:)

+0

这并不能解决新的传入连接请求超时的问题。当连接已经建立时,当我使用Wi-Fi锁定时,连接变得更加稳定。但是,它不会影响必须建立的新连接。 – Vitaliy

相关问题