自从从Ice Cream Sandwich升级到Jelly Bean以来,我的客户端(Galaxy Nexus)和自定义服务器之间似乎存在时间问题。以下是一般流程:
在Jelly Bean更新之前的几个月里,这种方法运作良好。由于更新,二进制传输大约70%的时间成功。剩下的30%失败了 当'serverSocket.getInputStream()。read'返回-1表示已到达流的末尾。没有读取数据,没有引发错误异常,logcat中没有任何内容。
当我在步骤#5中更改服务器行为时,会出现计时问题。写入后,线程正在关闭套接字并发现观察到的问题。如果我删除套接字关闭,在写入后终止线程,让操作系统最终关闭套接字,然后它似乎一直在工作。
我使用tcpdump和WireShark查看成功和失败情况下的数据包。在失败的情况下,套接字在几毫秒内关闭,而在成功的情况下,套接字关闭是四分之一或更多秒。这样做的结果是我们在套接字关闭时造成的任何延迟都会提高我们成功的机会。
如果有人对我们可能采取的行动提出任何建议,或者就如何缩小问题提出建议,请随时回复。如果需要,我可以添加代码示例。
答案 0 :(得分:-1)
看起来当服务器要求关闭连接时,套接字立即关闭。也许默认ocket的时间在版本???
之间发生了变化尝试使用以下方法设置套接字延迟时间:
socket.setSoLinger(boolean on, int timeout);
如果某些数据仍在等待发送,让服务器在关闭通道之前等待一段时间。
如果这不能解决,您可以将上面的流程更改为:
...
4.Client从套接字读取数据并保存到文件中。
5.Client向服务器发送确认。
6.Server close connection。
- EDITED-- 在没有额外的TCP数据包传输以进行结束确认的情况下,获得上述内容的优雅方法是:
当服务器完成对套接字调用的写入时:
socket.shutdownOutput();
当客户端socket.read()返回-1时,客户端调用:
socket.close();
这可确保客户端被告知已发送所有数据,并且发送方将等待套接字关闭协议完成。