内网中,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();
}
}
效果:
文章参考:
本文后续维护和修改,若有不足,请指正,谢谢!