我正在尝试使用来自服务器的给定链接的URL类下载一些内容。
我的下载代码是:
URL url = new URL(downloadUrl);
InputStream stream = url.openStream();
byte[] content = new byte[stream.available()];
stream.read(content);
stream.close();
但是在跑步时我得到以下例外:
java.io.IOException: SSL handshake failure: Failure in SSL library, usually a protocol error
error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol (external/openssl/ssl/s23_clnt.c:604 0xaf076228:0x00000000)
at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.nativeconnect(Native Method)
...
我使用的链接类似于:
https://contentserver.com/d/761/34/215656/5de1a41ea3bc9c81978af95ed19b03286f64d9a3
我知道如果我在浏览器上输入它,它会下载一个文件,我想通过Java下载相同的文件。
由于
答案 0 :(得分:1)
从java中的https url读取数据的代码
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.net.*;
import java.security.Security;
import java.util.Properties;
public class UseHttps {
public static void main(String argv[]) {
String fullURL = "https://fortress.wa.gov/lni/bbip/detail.aspx?License=SIBLUCL004C5";
try {
URL page = new URL(fullURL); // Process the URL far enough to find the right handler
URLConnection urlc = page.openConnection();
urlc.setUseCaches(false); // Don't look at possibly cached data
System.out.println("Content-type = " + urlc.getContentType()); // See what's here
System.out.println("Content-length = " + urlc.getContentLength()); // See how much of it there is
// Read it all and print it out
BufferedReader br = new BufferedReader(new InputStreamReader(urlc.getInputStream()));
String buffer = "";
while (buffer != null) {
try {
System.out.println(buffer);
buffer = br.readLine();
}
catch (IOException ioe) {
ioe.printStackTrace();
break;
}
}
}
catch (MalformedURLException mue) {
System.out.println(fullURL + " is not a URL that can be resolved");
}
catch (IOException ie) {
ie.printStackTrace();
}
}
}
答案 1 :(得分:0)
马科斯,
这可能完全无关紧要,但是......我得到了同样的错误......
abort: error: _ssl.c:490: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol
...试图在我的bitbucket.org mercurial repo上做“hg clone” ...,我试图从windows命令行通过https连接到bitbucket ...它事实证明我向我的代理提供了错误的密码...
答案 2 :(得分:0)
虽然我不确定您的SSL错误,但您阅读数据的方式很可能不是您想要的。 InputStream.available()不是流中的数据量。根据定义,流是“无界限的”,只有当它结束时它才结束。 InputStream不知道它有多少字节。可用方法()只是告诉你可以在不阻塞IO的情况下读取多少字节。