今天闲来无事,看同事在做IIS监控内容,我想咱也没事看看HTTP什么的,在网上看,觉得Apache的httpclient开源包不错,封装了很多http操作,但目前我还没有仔细研究,只是用简单的socket连接,于是在网上搜罗代码,发现有两种方式可以进行访问,不过第二种目前我没有调试成功,第一种没有问题,因为我就是用公司的代理服务器上网的。

代码如下:

代码

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
// import java.net.Authenticator;
import java.net.HttpURLConnection;
// import java.net.PasswordAuthentication;
import java.net.URL;
import java.net.URLConnection;
// Base64编码用
import sun.misc.BASE64Encoder;

public class ProxyTest {
    // 这个是第二种,不过目前我没调通
    /**
     * 对代理进行初始设置
     * 
     * @param host
     *            代理服务器的IP
     * @param port
     *            代理服务器的端口
     * @param username
     *            连接代理服务器的用户名
     * @param password
     *            连接代理服务器的密码
     */
    public static void initProxy(String host, int port, final String username,

final String password) {
        // 设置一个默认的验证器
        /*
         * Authenticator.setDefault(new Authenticator() {
         * 
         * protected PasswordAuthentication getPasswordAuthentication() {
         * 
         * return new PasswordAuthentication(username,
         * 
         * new String(password).toCharArray());
         * 
         * }
         * 
         * });
         */
        // 设置对HTTP进行代理,key可以写成http.proxyXxxx或proxyXxxx两种形式
        // System.setProperty("http.proxyType", "4");
        System.setProperty("http.proxyPort", Integer.toString(port));

System.setProperty("http.proxyHost", host);

System.setProperty("http.proxySet", "true");

}

public static void main(String[] args) throws IOException {
        // main中的是第二种,通过在头部加入Proxy-Authentication信息,通过Base64编码传递
        // String ftpurl = "ftp://204.2.225.157/favicon.ico";
        // String ftpurl = "ftp://204.2.225.157/robots.txt";
        /*
         * String httpurl = "http://www.sina.com";
         * 
         * String proxy = "192.168.1.95";// 代理服务器IP
         * 
         * int port = 80;// 代理服务器端口
         * 
         * String username = "dizh";// 连接代理服务器的用户名
         * 
         * String password = "dizhuang1984HIT*";// 连接代理服务器的密码
         * 
         * String temp = "D:/temp";// 存放文件的临时目录
         * 
         * initProxy(proxy, port, username, password);
         * 
         * // test(ftpurl, temp); test(httpurl, temp);
         */
        try {
            System.setProperty("http.proxySet", "true");
            System.setProperty("http.proxyHost", "192.168.1.95");
            System.setProperty("http.proxyPort", "8080");

URL u = new URL("http://www.baidu.com");
            HttpURLConnection conn = (HttpURLConnection) u.openConnection();

String authentication = "dizh:dizhuang1984HIT*";
            String encodedLogin = new BASE64Encoder()
                .encodeBuffer(authentication.getBytes()).replaceAll("\n", "");
            conn.setRequestProperty("Proxy-Authorization", "Basic "
                + encodedLogin);
            conn.connect();

int length = conn.getContentLength();
            System.out.println(length);
            InputStream is = conn.getInputStream();
            byte[] b = new byte[4 * 1024];
            is.read(b);
            for (int i = 0; i < b.length; i++) {
                System.out.print((char) b[i]);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

}
}

这样,就可以访问baidu了,不过这段代码我抄别人,需要注意的是解析返回内容那里可能不是很对,这就是个demo版本的。

PS : 如果不加replaceAll方法,会出现:

java.lang.IllegalArgumentException: Illegal character(s) in message header value: Basic Y2FpeGlhbjI6OTYxOTEyNjQ=

   at sun.net.www.protocol.http.HttpURLConnection.checkMessageHeader(HttpURLConnection.java:200)   at sun.net.www.protocol.http.HttpURLConnection.setRequestProperty(HttpURLConnection.java:1553)  at src.test.URLTest.main(URLTest.java:23)Exception in thread "main" 

上面提示的错误,按照网上人解释是:

“由于BASE64Encode会在字符多余76个(我也不知道为什么要是76个)的时候在数组尾部添加换行符“\n”,由于这个的原因导致了程序出错。”

转载于:https://www.cnblogs.com/diyunpeng/archive/2009/12/02/1615020.html

Java通过代理服务器访问外部网络相关推荐

  1. linux 局域网无法访问 防火墙已关,使用iptables配置防火墙后本机无法访问外部网络...

    在一台centos和ubuntu的主机上使用配置了防火墙,就是添加几条简单规则.规则确实是生效了,因为很好的屏蔽掉外部的非法请求,但是本机却无法和外部通信,包括同一个局域网的其他机器和外部互联网上的机 ...

  2. Hyper-V Default Switch 无法访问外部网络解决方案

    问题1 问题描述 今日遇到了 Hyper-V Default Switch 无法访问外部网络的问题,详情为: 可以 ping 通宿主机,也就是 Default Switch IP: 无法 ping 通 ...

  3. vm虚拟机使用NAT模式访问外部网络

    vm虚拟机使用NAT模式访问外网 使用vmware虚拟机网络配置上踩了太多的坑,花了得有几十个小时在上面,每次解决以后下次创建虚拟机可能又出现无法访问外部网络的问题,所以出个配置贴 虚拟机本人使用的是 ...

  4. 容器学习 之 容器访问外部网络(十四)

    容器访问外部世界 docker host 是可以访问外网的. 容器也能访问外网 为什么容器能够访问到外网呢?我们先来查看iptables的规则 -A POSTROUTING -s 172.17.0.0 ...

  5. eNSP内部网络访问外部网络实验

    实验目的 掌握ospf协议的配置方法: 掌握telnet远程登录的基本配置: 掌握交换机端口的 VLAN 配置方法. 实验内容 内部网络要求互通: 内部网络能够连接外部的服务器: 路由器能够获取外部服 ...

  6. 阿里云服务器内部无法访问外部网络解决方法

    某个项目要进行实施工作,购买了50台左右的阿里云的服务器. ** 由于服务器安全及其他原因,购买了NAT网关.但是在测试配置时,局域网内的所有服务器 ping 公网 ip 都无法 ping 通,但是私 ...

  7. java配置代理服务器访问外网

    最近新上线一个项目,内网部署,设置了一个代理服务器,但是需要同时调内网的系统A和外网的系统B,所以不能直接给服务器或者tomcat加代理把所有链接都转代理,故只能在java代码上增加一段代码,需要调用 ...

  8. CentOS虚拟机访问外部网络

    这里写自定义目录标题 虚拟机无网络测试 解决方案 1.设置VM(关闭虚拟机) 2.查看当前IP.网关.子网掩码 3.设置虚拟机IP.网卡.子网掩码 虚拟机无网络测试 CentOS使用yum下载gcc时 ...

  9. 访问 Neutron 外部网络 - 每天5分钟玩转 OpenStack(143)

    前面我们学习了位于不同 Neutron subnet 的 instance 可以通过 router 通信,今天开始讨论 instance 如何访问外部网络. 这里的外部网络是指的租户网络以外的网络.租 ...

  10. curl 通过代理服务器访问外网的接口

    最近项目遇到一个问题:由于项目部署的环境是内网,但是业务中需要访问外部网络的接口 所以通过代理服务器来访问外网.废话不多说直接上代码 // 接口地址$requestUrl = 'http://api. ...

最新文章

  1. PHP开发中,让var_dump调试函数输出更美观 ^_^#
  2. java生成tif图片的缩略图,将多页tif文件转换为图像文件,并生成缩略图
  3. 【知识强化】第一章 操作系统概述 1.1 操作系统的基本概念
  4. boost::phoenix::find相关的测试程序
  5. Oracle WebCenter 11g 快速开发指南--翻译(二)
  6. 微信公布10月朋友圈十大谣言 包括牙膏能杀灭幽门螺杆菌等
  7. [理解需求变更之一]说说需求变更的必然
  8. SpringMVC(入门案例)
  9. 请问!退休年龄到了,社保没交够,现在职,公司还可以继续交吗?
  10. 课堂破冰游戏“猜猜他是谁”
  11. OpenCV:鼠标画直线并显示坐标
  12. flutter基础 dart语言学习笔记
  13. 好用的Android软件汇总
  14. 计算机考试打字合格速度,雅思考试使用机考,打字速度决定最终成绩
  15. 163邮箱怎么申请注册?邮箱收费版怎么收费?163邮箱收费版优势?
  16. altera fpga 型号说明_ALTERA之FPGA主流芯片选型指导.doc
  17. python opencv 通过hsv阈值法扣取药盒 并矫正
  18. [转]华为公司员工待遇全面揭秘
  19. python 12306查询不到车次_Python3.x 抓取12306车次信息,表格详情显示,让你学会思路,分析网站特点,爬取数据。12306车票查看器!...
  20. c语言 精华,C语言课件完整版(精华)

热门文章

  1. 14. 调整数组顺序是奇数位于偶数前(C++版本)
  2. VS2015 编译Protobuf
  3. Centos7---1708 Linux上从零开始安装mysql
  4. 非极大值抑制_【目标检测系列】非极大值抑制(NMS)的各类变体汇总
  5. python中pop用法_python中pop()函数的用法
  6. Cesium:向地图中添加线的方法
  7. Cesium:结合天地图实现中文定位
  8. Spring Boot 中使用WebJars引入javasript依赖
  9. 最简单的vscode使用入门教程
  10. JDK中IdentityHashMap使用详解