http://gezhicheng.javaeye.com/blog/764228
動態切換IP的實現主是也由Windows的rasdial命令提供的,其實不是java的功勞,java只是調用一下bat指令碼而已:
rasdial命令:
撥號
Java代碼 :
- 文法: rasdial 串連名稱 username password
- 執行個體: rasdial 我的寬頻 hzhz1234567890 dfdfdfdfdf
斷網
Java代碼
- 文法:rasdial 串連名稱 /disconnect
- 執行個體: rasdial 寬頻 /disconnect
java程式調用rasdial命令:(其中讀取CMD返回訊息時可能會亂碼,注意紅色字型那一句的編碼設定)
Java代碼
package com.sesame.network;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class ConnectNetWork {
/**
* 執行CMD命令,並返回String字串
*/
public static String executeCmd(String strCmd) throws Exception {
Process p = Runtime.getRuntime().exec("cmd /c " + strCmd);
StringBuilder sbCmd = new StringBuilder();
BufferedReader br = new BufferedReader(new InputStreamReader(p
.getInputStream(),"GB2312")); //這裡很重要,設定GB2312解決亂碼!!!
//如果程式預設編碼就是GB2312,可以不寫
//我NetBeans預設用UTF8
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[1000];
in.read(b);
String msg = new String(b,"GB2312"); //用GB2312解釋這堆位元組,就可以組裝成一個正常的String了
//如果上邊不寫GB2312,等於這裡用UTF8組裝,結果一樣
}
/**
* 串連ADSL
*/
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);
// 判斷是否串連成功
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;
}
}
public static void main(String[] args) throws Exception {
connAdsl("寬頻","hzhz**********","******");
Thread.sleep(1000);
cutAdsl("寬頻");
Thread.sleep(1000);
//再連,分配一個新的IP
connAdsl("寬頻","hzhz**********","******");
}
}
執行結果:
Java代碼
- 正在建立串連.
- 已成功建立串連.
- 串連已斷開
- 正在建立串連.
- 已成功建立串連.
小結:
實現這個功能的最主要在於bat命令能支援這個功能,和以前寫過的自動化佈建ip功能類似,這些功能實現java其實是很不方便的,看來要優雅的實現和windows作業系統相關的行為,學習windows編程才行。
重撥機制:
Java代碼
- while(!connAdsl("寬頻","hzhz**********","******")){
- Thread.sleep(1000);
}