2012-05-24 125 views
2

我正在写一个使用TCP套接字连接的客户端 - 服务器应用程序。在我的android项目中,Service创建一个用于监听TCP套接字的线程。Android很长一段时间后TCP套接字连接失败

一切似乎确定。但我有一个问题..我的网络服务在后台运行良好;但一段时间后(10-15分钟),当我尝试再次打开我的应用程序(主要活动)时,我无法从套接字连接获取响应。它冻结或什么?我不能发送或从套接字获取TCP消息..这可能是什么原因?我正在通过3G连接在我的手机上工作。

(此外,在模拟器中运行的应用程序还没有得到这样的这个问题,我认为它的连接是稳定的,长期的过程)

谢谢您的回答。

+0

定义“无法从套接字连接获取响应”。你的意思是在阅读时?并定义“它冻结或什么”。究竟发生了什么?没有?例外? – EJP

+0

没有例外..我通过发送保存活动包解决了这个问题.. –

回答

0

当我在我的应用程序中遇到类似情况时,通常是因为电话的功率优化(不能被覆盖)。如果套接字闲置时间过长,它会自动关闭并需要重新打开。

1

由于功耗优化和连接可能的变化(GPRS/HSDPA/Wifi),很可能您的连接正在被丢弃。

为了保持连接,您的后台服务需要使用PowerManager类声明唤醒锁。这可以防止设备进入省电模式,从而断开您的插座。但要小心,这会显着降低设备的电池寿命。

此外,您需要处理连接中断开您的打开连接的更改。 Android发送名为android.net.conn.CONNECTIVITY_CHANGE的广播消息以通知连接性的变化。

根据您的使用情况我会当设备处于睡眠模式与轮询当设备处于有效使用中或刚使用C2DM推送通知

+0

嗯,谢谢你的回答。是发送保持活着的数据包每3分钟或什么可以成为我的解决方案?你怎么看? –

+0

我想你可以用一个唤醒锁来做到这一点,但是你可能最终每隔3分钟重新连接一次。你能更具体地说明你需要什么吗?聊天,推送通知? –

+0

是的,它可以是聊天通知..但重要的一点是,当我重新打开我的应用程序,建立连接不提供。连接失去了某种程度。我必须强制停止我的应用程序。这是一个问题。 –

0

你是从发送数据仅建立一个连接时间到?像执行心跳协议一样?如果你不是,你应该......或者它可能与套接字读/写超时有关

+0

嗯我不发送任何数据的时间,我应该每隔3min发送保持活着的数据包? –