标签:
在项目我碰到一个问题就是需要判断公网和专网,那么我是这么写一个方法的,方法代码如下:// 判断是否能够访问外网 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可能就阻塞了。
标签:
原文地址:http://blog.csdn.net/xiaxiangnanxp1989/article/details/46549737