2

我正在编写一个使用 TCP 套接字连接的客户端-服务器应用程序。在我的 android 项目中,Service 创建了一个用于侦听 TCP 套接字的线程。

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

(此外,在模拟器中运行的应用程序没有这个问题;我假设它的连接是稳定的,长时间的)

谢谢你的回答。

4

3 回答 3

1

由于电源优化以及连接(GPRS/HSDPA/Wifi)的变化,您的连接很可能会被断开。

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

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

根据您的用例,我会在设备处于睡眠模式时进行轮询,并且仅在设备正在积极使用或仅使用 C2DM 推送通知时建立连接

于 2012-05-24T21:16:31.043 回答
0

当我在我的应用程序中遇到这样的事情时,通常是因为手机上的电源优化(不能被覆盖)。如果套接字空闲时间过长,它会自动关闭,需要重新打开。

于 2012-05-24T19:31:21.187 回答
0

您是否不时发送数据?就像实现心跳协议一样?如果你不是,你应该......或者它可能与套接字读/写超时有关

于 2012-05-24T21:35:22.603 回答