首页 > 编程 > Java > 正文

Java实现随意切换VPN改变上网地区

2019-11-26 15:06:38
字体:
来源:转载
供稿:网友

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表