内网中,JAVA通过代理方式,访问URL

1)前言:企业实际开发中,会遇到这样的情况,在浏览器中可以访问域名地址(如:www.baidu.com),但是实际在命令行中,通过ping命令是ping不通的。

2)原因:

2.1)首先我们的电脑能连接到外网,在通过域名访问地址时,正常的访问流程是,先到最近的域名服务器中找对应域名的IP地址,若无,则继续往上层域名服务器找,若有则返回,然后我们的计算机通过替换域名去访问对应的服务。

2.2)但是,我们在内网的话,是访问不了外网的,只能通过一台代理服务器,访问到外网

注:这里用nslookup命令是可以得到域名对应的IP,但是PING还是不通,估计用的协议或者底层不一样。

2.3)综上两点,内网的浏览器能访问到外网,是因为有代理服务器的存在,所以看下浏览器的设置,果然如此。

3)由于JAVA访问外网,是基于本地计算机的环境的,所以需要设置代理,本人目前了解到有两种代理方式访问到外网地址

3.1)通过socket方式访问:

import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;

public class UrlConnectionUtil {

	public static void main(String[] args) throws Exception {
		//成功,但不断开连接
		getInfoBySocket();
	}

	/**
	 * 通过Socket访问
	 * @throws Exception
	 */
	public static void getInfoBySocket() throws Exception{
		Socket socket = new Socket("192.168.99.100", 80);
		socket.getOutputStream().write(new String("GET https://www.baidu.com HTTP/1.1\r\n\r\n").getBytes()); 
		byte[] bs = new byte[1024];  
		InputStream is = socket.getInputStream();
		int i;
		StringBuilder str = new StringBuilder();
		while ((i = is.read(bs)) > 0) {
		    System.out.println(new String(bs, 0, i));
			//str.append(new String(bs,0,1));
		}
		is.close(); 
	}
	
	
}

效果:

3.2)通过Proxy代理访问http、https或者其他协议的url

代码:

import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;

public class UrlConnectionUtil {

	public static void main(String[] args) throws Exception {
		getInfoByProxy();
	}
	
	/**
	 * 通过Proxy代理访问http协议的url
	 * @throws Exception
	 */
	public static void getInfoByProxy() throws Exception{
		//设置代理 
		
		//HTTP协议
//		System.setProperty("http.proxySet", "true");
//		System.setProperty("http.proxyHost", "192.168.99.100");
//		System.setProperty("http.proxyPort", "80");
		
		//HTTPS协议
//		System.setProperty("https.proxySet", "true");
//		System.setProperty("https.proxyHost", "192.168.99.100");
//		System.setProperty("https.proxyPort", "80");
		
		//直接设置系统属性,设置后所有网络请求都有效
		System.setProperty("proxyType", "4");
        System.setProperty("proxyPort", "80");
        System.setProperty("proxyHost", "192.168.99.100");
        System.setProperty("proxySet", "true");

		//直接访问目的地址  
		URL url = new URL("https://www.baidu.com");
		URLConnection con = url.openConnection();
		InputStreamReader isr = new InputStreamReader(con.getInputStream());
		char[] cs = new char[1024];  
		int i = 0;  
		while ((i = isr.read(cs)) > 0) {  
		    System.out.println(new String(cs, 0, i));  
		}  
		isr.close();
	}
	
}

效果:

文章参考:

Java代理使用及代理原理

java中设置网络代理

本文后续维护和修改,若有不足,请指正,谢谢!

猜你喜欢

转载自blog.csdn.net/qq_33172029/article/details/82913168