我有一个简单的客户端 - 服务器应用程序,它通过REST API下载文件。当我使用基本的http auth时,文件通过ssl发送。
//my download loop
HttpsURLConnection conn;
//some handling of response codes and content-length
InputStream s = conn.getInputStream();
while (true) {
i = br.read(buffer); //if server shuts down, I stall here
if (i == -1)
break;
downloadedSize += i;
fis.write(buffer, 0, i);
}
这一切都正常,没有问题,直到代码遇到服务器关闭文件传输的情况。那时代码只是拖延而且我有一个无用的线程。
我的问题是如何检测服务器已关闭?在Wireshark中,我看到发送了一个RST信号,但没有引发异常。在我看来,这是一项相当普遍的任务 但我还没有找到一个直截了当的答案。
目前我正在使用计划任务,检查是否有任何进展下载 时不时。如果它检测到问题,那么它会创建一个新的workerThread并告诉我的通信服务使用那个。
这是一个非常难看的解决方案,因为线程最终可能会成为孤儿。
如果有可用的数据,我尝试使用available()来查看,但由于这是SSL,它总是返回0.
答案 0 :(得分:1)
原来我一直在调用conn.setReadTimeout(5000);在错误的地方
conn = getConnection(address);
conn.setReadTimeout(5000);
conn.setRequestMethod("GET");
这将导致read()无法正确失败。