[英]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.