Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 处理连接问题HttpsURLConnection_Java_Android_Http_Rest_Https - Fatal编程技术网

Java 处理连接问题HttpsURLConnection

Java 处理连接问题HttpsURLConnection,java,android,http,rest,https,Java,Android,Http,Rest,Https,我有一个简单的客户端-服务器应用程序,可以通过RESTAPI下载文件。当我使用基本http身份验证时,文件通过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 serv

我有一个简单的客户端-服务器应用程序,可以通过RESTAPI下载文件。当我使用基本http身份验证时,文件通过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信号,但没有引发异常。在我看来,这是一项相当普通的任务,而且 但我还没有找到一个直截了当的答案

当前Im使用一个计划任务,该任务检查在下载每个 偶尔。如果它检测到问题,那么它将创建一个新的workerThread并告诉我的通信服务使用该线程

这是一个非常丑陋的解决方案,因为线程可能最终成为孤立线程


我尝试使用available()查看是否有可用数据,但由于这是SSL,它总是返回0。

结果我一直在调用conn.setReadTimeout(5000);在错误的地方

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

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

我见过的两种方法是(a)将
InputStream
包装在
BufferedStreamReader
中,并使用
ready()
方法,或者(b)通过
conn
获取套接字并使用
getSoTimeout()
方法。虽然不能保证这两种方法的有效性,但是如果在使用SSL时返回false,那么.ready()将不起作用,但我使用了超时解决方案。事实证明,在实际打开连接后,我一直在错误的时间设置超时。连接设置读取超时(整数毫秒);成功了。