setConnectTimeout無效果,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 blocke.printStackTrace();return false;} finally {try {bis.close();is.close();} catch (Exception e) {// TODO Auto-generated catch blocke.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可能就阻塞了。