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");
}
}