Java实现随意切换VPN改变上网地区
程序员文章站
2024-03-05 14:43:37
在很多情况下,有些网络应用的需求会要求模拟人在不同地区访问网站和应用。因而切换ip也就应运而生了,然而ip作为一种稀缺资源不是随便可以获得的。因而会想到应用程序切换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只是个外壳。又一次曲线救国。大家有更好的方法吗?有更好的方法的话请告诉我,^_^
上一篇: Zend Framework入门教程之Zend_Mail用法示例
下一篇: Java数据结构之线性表