这样URLConnection connection timeout一个问题:
代码:
URL url= new URL(urlString); URLConnection conn=url.openConnection();
异常问题:
java.net.ConnectException: Connection timed out: connect at java.net.DualStackPlainSocketImpl.connect0(Native Method) at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:345) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) at java.net.Socket.connect(Socket.java:589) at sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:656) at sun.security.ssl.BaseSSLSocketImpl.connect(BaseSSLSocketImpl.java:173) at sun.net.NetworkClient.doConnect(NetworkClient.java:180) at sun.net.www.http.HttpClient.openServer(HttpClient.java:432) at sun.net.www.http.HttpClient.openServer(HttpClient.java:527) at sun.net.www.protocol.https.HttpsClient.<init>(HttpsClient.java:275) at sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:371) at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(AbstractDelegateHttpsURLConnection.java:191) at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1104) at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:998) at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:177) at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1512) at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1440) at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480) at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:338)
当上面的urlstring 为内部一个url链接时,没有问题。但是是公司外部链接时,出错了。于是想到了代理,公司局域网内没问题,访问外网通过代理。
解决办法:
1. 设置代理属性
System.setProperty("http.proxyHost", "proxy IP");
System.setProperty("http.proxyPort", "proxyPort");
注意如果你访问的是https类型的url. 请使用https.proxyHost 和 https.proxyPort。 当然还要设置其他SSL相关属性。
2. 设置代理
String urlString="http://www.soosmart.com";
String proxyIp="proxyIP"; //代理Ip地址
int Port=80; //代理提供的开放端口
try {
/*构造Proxy对象,以适用于代理上网的方式*/
InetSocketAddress socketAddress=new InetSocketAddress(
InetAddress.getByName(proxyIp),Port);
Proxy proxy=new Proxy(Proxy.Type.HTTP,socketAddress);
/*构造url对象*/
URL url= new URL(urlString);
/*测试是否能够打开连接,获得输入流,连接方式是直连方式*/
// InputStream inputStream=url.openConnection().getInputStream();
/*下面用代理的方式进行连接,需要构造Proxy对象*/
InputStream input=url.openConnection(proxy).getInputStream();
if(input !=null){
System.out.println("Connectioned");
}
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}