繁体   English   中英

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

[英]Java on Android - Strange socket behavior with InputStream timeout errors

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

当我的Android应用始终处于“活动状态”(未最小化)时,通信就没有问题。 连接持续多长时间都没有关系。

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

连接仍然有效,服务器可以写入和读取。 客户端的isInputShutdown()返回false。

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

但是,使用OutputStream将数据从客户端写入服务器的效果很好。

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

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

如果有人有类似的经验并找到了解决方案,请与我分享,我将非常高兴。

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

正如Kevin Krumwiede指出的那样: 套接字输出流android的奇怪行为,每隔X分钟(例如3或4分钟)发送数据时,即使“暂停”了30分钟后,一切仍然可以正常工作。

我希望Socket.setKeepAlive(true)足以使连接保持活动状态,因此我不必造成太多不必要的网络流量,但是在我的特定情况下,这没有帮助。

每X分钟发送1字节的“垃圾”可“解决”问题。

暂无
暂无

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

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