Android上的Java - 使用InputStream超时错误的奇怪套接字行为

时间:2014-07-14 16:09:31

标签: java android sockets tcp android-networking

我有一个应用程序,它使用Socket类的实例与服务器通信。 我使用socket.getInputStream()socket.getOutputStream()返回的流来读写数据。

当我的Android应用程序总是"活跃" (未最小化),通信没有问题。连接持续多久并不重要。

当我"暂停"应用程序并快速重新打开它,一切仍然正常。 但是,当我暂停应用程序大约5分钟并重新打开它时,InputStream显示出奇怪的行为:它停止阅读任何内容。我收到超时错误而不是服务器发送的数据。

连接仍然存在,服务器能够写入和读取。客户端的isInputShutdown()返回false。

使用网络分析工具,我还可以看到服务器IN FACT发送的数据到达客户端,但它以某种方式无法被InputStream识别...

但是,使用OutputStream将数据从客户端写入服务器可以正常工作。

也许值得一提的是,套接字对象和流声明为static,可供应用程序的所有活动访问。但由于我对OutputStream没有任何问题,我无法想象这可能是原因。

此时我唯一的解决方法是关闭整个套接字并将新的套接字连接到服务器。但这会导致不必要的网络流量,因为我必须再次握手。最好不要这样做。

如果有人有类似的经历并找到了解决方案,如果你能和我分享,我会很高兴。

2 个答案:

答案 0 :(得分:0)

您应该创建一个将在后台运行的服务,并实现与服务器的套接字连接。

答案 1 :(得分:0)

正如Kevin Krumwiede所指的那样:Strange behavior of socket outputstream android,每隔X分钟(例如3或4)发送数据时,即使在“暂停”30分钟后,一切仍然有效。

我希望Socket.setKeepAlive(true)足以使连接保持活动,所以我不必造成太多不必要的网络流量,但在我的特殊情况下,这没有用。

每X分钟发送1个字节的'垃圾'解决了这个问题。