在很多情況下,有些網絡應用的需求會要求模擬人在不同地區訪問網站和應用。因而切換IP也就應運而生了,然而IP作為一種稀缺資源不是隨便可以獲得的。因而會想到應用程序切換VPN來達到全國不同地區訪問網絡。因而有了以下方案。
前提:
1、windows操作系統
2、手工新建網絡連接
package com.selenium.test;import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;public class ConnectNetWork { /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { // TODO Auto-generated method stub connAdsl("VPN_Test","test", "test"); Thread.sleep(1000); cutAdsl("VPN_Test"); Thread.sleep(1000); } /** * 執行CMD命令,并返回String字符串 */ public static String executeCmd(String strCmd) throws Exception { System.out.println("cmd /c " + strCmd); Process p = Runtime.getRuntime().exec("cmd /c " + strCmd); StringBuilder sbCmd = new StringBuilder(); //這里很重要,設置GB2312解決亂碼?。?! //如果程序默認編碼就是GB2312,可以不寫 //我NetBeans默認用UTF8 BufferedReader br = new BufferedReader(new InputStreamReader(p .getInputStream(), "GB2312")); String line; while ((line = br.readLine()) != null) { sbCmd.append(line + "/n"); } return sbCmd.toString(); /* //如果整個過程換成這樣,就更清楚了。getInputStream是獲取最原始的字節流, //cmd返回的是以GB2312雙字節編碼的字節流 InputStream in = p.getInputStream(); byte[] b = new byte[2000]; in.read(b); String msg = new String(b, "GB2312"); //用GB2312解釋這堆字節,就可以組裝成一個正常的String了 //如果上邊不寫GB2312,等于這里用UTF8組裝,結果一樣 return msg; */ } /** * 連接ADSL * 語法: rasdial 連接名稱 username password * 實例: rasdial 我的寬帶 hzhz1234567890 dfdfdfdfdf */ public static boolean connAdsl(String adslTitle, String adslName, String adslPass) throws Exception { System.out.println("正在建立連接."); String adslCmd = "rasdial " + adslTitle + " " + adslName + " " + adslPass; String tempCmd = executeCmd(adslCmd); //String tempCmd = executeCmd("ping www.youku.com"); // 判斷是否連接成功 if (tempCmd.indexOf("已連接") > 0) { System.out.println("已成功建立連接."); return true; } else { System.err.println(tempCmd); System.err.println("建立連接失敗"); return false; } } /** * 斷開ADSL */ public static boolean cutAdsl(String adslTitle) throws Exception { String cutAdsl = "rasdial " + adslTitle + " /disconnect"; String result = executeCmd(cutAdsl); if (result.indexOf("沒有連接")!=-1){ System.err.println(adslTitle + "連接不存在!"); return false; } else { System.out.println("連接已斷開"); return true; } } }
說明:上述代碼片段其實是調用了windows的rasdial命令。所以主要的功勞還是rasdial,java只是個外殼。又一次曲線救國。大家有更好的方法嗎?有更好的方法的話請告訴我,^_^
新聞熱點
疑難解答