setConnectTimeout无效果

在项目我碰到一个问题就是需要判断公网和专网,那么我是这么写一个方法的,方法代码如下:
// 判断是否能够访问外网
	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可能就阻塞了。

你可能感兴趣的:(setConnectTimeout无效果)