Java实现随意切换VPN改变上网地区
在很多情况下,有些网络应用的需求会要求模拟人在不同地区访问网站和应用。因而切换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只是个外壳。又一次曲线救国。大家有更好的方法吗?有更好的方法的话请告诉我,^_^
赞 (0)
