在项目我碰到一个问题就是需要判断公网和专网,那么我是这么写一个方法的,方法代码如下:
// 判断是否能够访问外网
public static boolean openUrl() {
HttpURLConnection conn = null;
String myString = "";
InputStream is = null;
BufferedInputStream bis = null;
try {
URL url = new URL("http://www.baidu.com/index.html");
conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(1500);
conn.setRequestMethod("GET"); // 设定请求方式
conn.connect(); // 建立到远程对象的实际连接
if (conn.getResponseCode() != HttpURLConnection.HTTP_OK) {
System.out.println("网络错误异常!!!!");
return false;
}
is = conn.getInputStream();
bis = new BufferedInputStream(is);
// 用ByteArrayBuffer缓存
ByteArrayBuffer baf = new ByteArrayBuffer(50);
int current = 0;
while ((current = bis.read()) != -1) {
baf.append((byte) current);
}
myString = EncodingUtils.getString(baf.toByteArray(), "UTF-8");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
} finally {
try {
bis.close();
is.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (conn != null) {
conn.disconnect(); // 中断连接
}
}
if (myString.indexOf("baidu.com") > -1) {
return true;
} else {
return false;
}
}
在代码中我们可以看到我设置了连接超时的时间为1500毫秒
conn.setConnectTimeout(1500);
,但是实际的情况是当时专网的时候(不能访问百度)根本不是1.5秒抛出超时的异常,这个问题困扰2天,
也在网上查询很多资料,结果有人说还要设置读取超时conn.setReadTimeout(1500);结果一试还是不行,
就再找发现有人在使用的情况下查看控制台发现访问1500毫秒之后系统会自动的尝试很多次(集体多少次没有算)
导致很长时间才抛出访问超时异常,这样导致我们看到的现象就是我设置了1500毫秒超时结果几分钟才给我超时异常,感觉设置的超时时间没有效果。
那么说一下我的解决方法,我个人测试通过,如果有好的方法请指出:
因为系统会自动的尝试很多次超时之后才给你抛出异常,所以我把这个异常超时时间设置短一点如我设置500毫秒,公网的情况下能正常的访问,专网也能很快的抛出异常达到了我的目的。
另外判断公网和专网的另一种方法就是用ping ,记得要起一个服务区处理ping,关闭之后要杀死改进程,否则第二次ping可能就阻塞了。