Java程序设置本地代理

思路(注意:此方法设置的代理,需重启浏览器才可生效)

通过bat脚本设置系统代理,然后在java中调用bat。

实现

1.Java调用bat

当我们需要在java程序中调用外部程序,我们可用通过Runtime.exec()调用来完成。

java的Runtime.getRuntime().exec(commandStr)可以调用执行cmd指令。

cmd /c dir 是执行完dir命令后关闭命令窗口。 cmd /k dir 是执行完dir命令后不关闭命令窗口。

cmd /c start dir 会打开一个新窗口后执行dir指令,原窗口会关闭。

cmd /k start dir 会打开一个新窗口后执行dir指令,原窗口不会关闭。

例子:

import java.io.IOException;
import java.io.InputStream;
 
public class callbat {
  
  
      public static void main(String args[]){
         callCmd("C:/run.bat");
      }
      public static void  callCmd(String locationCmd){
          try {
          Process child = Runtime.getRuntime().exec(locationCmd);
          InputStream in = child.getInputStream();
          int c;
          while ((c = in.read()) != -1) {
              System.out.println((char)c);
      }
       in.close();
       try {
           child.waitFor();
       } catch (InterruptedException e) {
           e.printStackTrace();
       }
       System.out.println("done");
     } catch (IOException e) {
           e.printStackTrace();
     }
 }
 }

关于java调用外部程序需要注意的事项

 1. 当调用的外部命令中包含重定向(<、>),管道( | ) 命令时,exec(String command)的版本不能正确解析重定向、管道操作符。所以需要使用exec(String [] cmdArray)。

 2.永远要在调用waitFor()方法之前读取数据流

 永远要先从标准错误流中读取,然后再读取标准输出流

 3.在exec()后 立即调用waitFor()会导致进程挂起。

 

2.bat脚本设置代理

在这里因为要要实现代理的动态变化,所以将bat内容放到了java代码中,每次生成对应的bat,运行,然后删除。如下:

        public static boolean setProxy(String ip, String port){
		String code = "@echo off\r\n"
				+ "set ip=" + ip + "\r\n"
				+ "set port=" + port + "\r\n"
				+ "REG ADD \"HKCU\\SOFTWARE\\MICROSOFT\\Windows\\CURRENTVERSION\\Internet Settings\\Connections\" /v \"DefaultConnectionSettings\" /t  REG_BINARY /d \"3C000000AA0100000B0000000F000000\" /f\r\n" 
				+ "REG ADD \"HKCU\\SOFTWARE\\MICROSOFT\\Windows\\CURRENTVERSION\\Internet Settings\" /v \"ProxyEnable\" /t  REG_DWORD /d \"1\" /f\r\n"
				+ "REG ADD \"HKCU\\SOFTWARE\\MICROSOFT\\Windows\\CURRENTVERSION\\Internet Settings\" /v \"ProxyServer\" /t  REG_SZ /d \"%ip%:%port%\" /f\r\n" 
				+ "REG ADD \"HKLM\\System\\CurrentControlSet\\Hardware Profiles\\0001\\SOFTWARE\\MICROSOFT\\Windows\\CURRENTVERSION\\Internet Settings\" /v \"ProxyEnable\" /t  REG_DWORD /d \"1\" /f\r\n" 
				+ "REG ADD \"HKCU\\SOFTWARE\\MICROSOFT\\Windows\\CURRENTVERSION\\Internet Settings\\Connections\" /v \"SavedLegacySettings\" /t  REG_BINARY /d \"3C000000AE0100000B0000000F000000\" /f\r\n" 
				+ "REG ADD \"HKCU\\SOFTWARE\\MICROSOFT\\Windows\\CURRENTVERSION\\Internet Settings\" /v \"ProxyOverride\" /t  REG_SZ /d \"\" /f\r\n" 
				+ "set rp=\"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\"\r\n"
				+ "set rk=\"ProxyServer\"\r\n"
				+ "for /f \"tokens=*\" %%a in ('reg query %rp% /v %rk%^|findstr %rk%') do (\r\n"
				+ "call :doit %%a\r\n"
				+ ")\r\n"
				+ "goto :eof\r\n"
				+ ":doit\r\n"
				+ "echo %3\r\n"
				+ "echo.&echo.\r\n"
				+ "exit";
		return runBat(code,ip+":"+port);
	}
        public static void removeProxy(){
		String code = "@echo off\r\n"
				+ "REG ADD \"HKCU\\SOFTWARE\\MICROSOFT\\Windows\\CURRENTVERSION\\Internet Settings\\Connections\" /v \"DefaultConnectionSettings\" /t  REG_BINARY /d \"3C000000AA0100000B0000000F000000\" /f\r\n" 
				+ "REG ADD \"HKCU\\SOFTWARE\\MICROSOFT\\Windows\\CURRENTVERSION\\Internet Settings\" /v \"ProxyEnable\" /t  REG_DWORD /d \"0\" /f\r\n"
				+ "REG ADD \"HKCU\\SOFTWARE\\MICROSOFT\\Windows\\CURRENTVERSION\\Internet Settings\" /v \"ProxyServer\" /t  REG_SZ /d \"\" /f\r\n" 
				+ "REG ADD \"HKLM\\System\\CurrentControlSet\\Hardware Profiles\\0001\\SOFTWARE\\MICROSOFT\\Windows\\CURRENTVERSION\\Internet Settings\" /v \"ProxyEnable\" /t  REG_DWORD /d \"1\" /f\r\n" 
				+ "REG ADD \"HKCU\\SOFTWARE\\MICROSOFT\\Windows\\CURRENTVERSION\\Internet Settings\\Connections\" /v \"SavedLegacySettings\" /t  REG_BINARY /d \"3C000000AE0100000B0000000F000000\" /f\r\n" 
				+ "REG ADD \"HKCU\\SOFTWARE\\MICROSOFT\\Windows\\CURRENTVERSION\\Internet Settings\" /v \"ProxyOverride\" /t  REG_SZ /d \"\" /f\r\n" 
				+ "exit";
		runBat(code,"");
	}
	
	private static boolean runBat(String code,String flag){
		File file = new File("temp.bat");
		String str = "";
		try {
			if(!file.exists()) file.createNewFile();
			PrintWriter pw = new PrintWriter(file);
			pw.write(code);
			pw.flush();
			pw.close();
			Process child = Runtime.getRuntime().exec("cmd /c temp.bat");
			InputStream in = child.getInputStream();
	        Scanner sc = new Scanner(in,"gbk");
	        while(sc.hasNext()){
	        	str += sc.nextLine();
	        }
	        try {
	            child.waitFor();
	        } catch (InterruptedException e) {
	            e.printStackTrace();
	        }
	        sc.close();
			Thread.sleep(1000);
			file.delete();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		if(str.contains(flag)) return true;
		else return false;
	}

 上面包括了删除代理的方法,在最后的时候,检测了是否设置成功,返回对应的结果。

完毕。

文章参考:[批处理]自动设置本机系统代理服务器

如果能帮到你,请右上角点个赞哦。

 

你可能感兴趣的:(java,代理,cmd)