当前位置: 移动技术网 > IT编程>开发语言>Java > Java实现随意切换VPN改变上网地区

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

2019年07月22日  | 移动技术网IT编程  | 我要评论

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网