Java网络编程HTTP代理的使用

来源:互联网 发布:java 分布式事务 编辑:程序博客网 时间:2024/06/01 01:34

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