Java网络编程HTTP代理的使用

Java网络编程HTTP代理的使用

HTTP协议中常用的方法有GET、POST等。若需要使用HTTP代理就要用到HTTP协议的CONNECT方法。

通过CONNECT方法将服务器作为跳板,让服务器代替用户去访问其它网页,最后将访问结果返回给用户。使用CONNECT方法需要使用TCP直接去连接。

public class Main {
  public static void main(String[] args) throws Throwable {
    Proxy proxy = new Proxy(Type.HTTP,new InetSocketAddress("xx.yy.zz.ddd",8411));
    Socket s = new Socket(proxy);
    s.connect(new InetSocketAddress("61.135.169.125",80));
    s.close();
    }
 }

通过Proxy指定代理服务器,并与目标机器连接,最终将通过代理服务器访问目标机器。

当要自定义HTTP头信息时,则需要自定义请求,然后再连接。下面的代码先通过socket与代理服务器建立tcp连接,然后再发送http 方法为connect的请求报文,当收到200的响应码时,表示代理请求发送成功,随后便可以通过这个socket来使用代码访问目标网站了。

public static Socket getSocket(String host, int port, String proxyHost, int proxyPort) throws IOException {
    Socket sock = new Socket();
    sock.setSoTimeout(10000);
    sock.connect(new InetSocketAddress(proxyHost, proxyPort), 2000);

    /**
     * http格式 RFC 2616
     */
    StringBuffer sb = new StringBuffer();
    sb.append("CONNECT " + host + ":" + port + " HTTP/1.1\r\n");
    sb.append("Host: " + host + ":" + port + "\r\n");
    sb.append("User-Agent: Java/1.8.0_20\r\n");

    sb.append("Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2\r\n");
    sb.append("Proxy-Connection: Keep-Alive\r\n");
    sb.append("bizId:ctrip\r\n");
    sb.append("clientIp:127.0.0.1\r\n");
    sb.append("\r\n");

    sock.getOutputStream().write(sb.toString().getBytes());

    byte[] tmpBuffer = new byte[1024];
    InputStream socketInput = sock.getInputStream();

    int len = socketInput.read(tmpBuffer, 0, tmpBuffer.length);

    if (len <= 0) {
      throw new SocketException("Invalid response from proxy");
    }

    String proxyResponse = new String(tmpBuffer, 0, len, "UTF-8");

    //  HTTP/1.x 200 OK http 代理请求发送成功
    if (proxyResponse.indexOf("200") != -1) {

      // 跳过此次交互的剩余数据
      if (socketInput.available() > 0) {
        socketInput.skip(socketInput.available());
      }
      // 代理连接成功, 返回socket进行后续读写
      return sock;
    } else {
      throw new IOException("Fail to create Socket");
    }
  }

参考

  1. https://stackoverflow.com/questions/7225873/how-to-connect-a-socket-server-via-http-proxy (通过http代理连接服务器)
  2. https://tools.ietf.org/html/rfc2616#page-7
  3. 图解HTTP
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值