0

我有一个简单的客户端-服务器应用程序,它通过 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。

4

1 回答 1

1

原来我一直在打电话 conn.setReadTimeout(5000); 在错误的地方

conn = getConnection(address);
    conn.setReadTimeout(5000);
    conn.setRequestMethod("GET");

这将导致 read() 正确失败。

于 2013-03-24T15:00:37.673 回答