
1,讲解一下基础知识:
HTTP:是应用层协议,是基于传输层协议的。
TCP: 是传输层协议,是基于网络层协议的。
IP: 是网络层协议。
一个TCP的连接要进行三次握手(就像转户口一样,不详说),HTTP只是一个应用协议,也就是相当于一个自定义协议,即其没有对底层的传输方式进行干涉,只是对数据内容格式进行了定义。
2,我们再说说HTTP代理,从上可以理解,HTTP代理服务器就是这样一台机器:你把所有的HTTP请求都发到这个 HTTP代理服务器,然后这个HTTP代理服务器请求你要访问的最终地址,把响应回传给你。这里还要注意它代理的是HTTP协议,而HTTP又是基于 TCP的,也就是说这个服务器代理的是指定HTTP内容格式的TCP连接。再说下去也没意思了,看以下代码:
//以下地址是代理服务器的地址
Socket socket = new Socket("10.1.2.188", 80)
//写与的内容就是遵循HTTP请求协议格式的内容,请求百度
socket.getOutputStream().write(new String("GET http://www.baidu.com/ HTTP/1.1\r\n\r\n").getBytes())
byte[] bs = new byte[1024]
InputStream is = socket.getInputStream()
int i
while ((i = is.read(bs)) >0) {
System.out.println(new String(bs, 0, i))
}
is.close()
3,当然在Java中,有Proxy代理上网的使用,此时使用URL(HTTP)就不涉及Socket(TCP)了,看如下代码
//设置代理
System.setProperty("http.proxySet", "true")
System.setProperty("http.proxyHost", "10.1.2.188")
System.setProperty("http.proxyPort", "80")
//直接访问目的地址
URL url = new URL("http://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()
在编写代理服务器之前,首先应该明白一点,Java的代理机制,如图所示:
那么Java就处于中间这层代理服务器,代理服务器所作的事情如下:
1、接收客户端请求,进行处理,然后发送给服务端
2、接收服务端响应,进行处理,然后发送给客户端
这样,就更清晰了,Java提供了代理的API为,java.net.Proxy类。此类表示代理设置,通常为类型(http、socks)和套接字地址。Proxy 是不可变对象。
也就是说Java可以制作高级协议的代理,如 HTTP 或 FTP。也可以制作SOCKS(V4 或 V5)代理。
首先,使用到了URL类,HttpURLConnection类及其我们的代理类Proxy类。他们都位于java.net包中。
第一步:生成代理,指定端口为8888:
第二步:使用URLConnection类进行连接www.moonsos.com
第三步:打开URL,并且读取HTML源码
在JAVA中怎么设置代理服务器呢,非常简单public void setServiceProxy(Config config) {
this.config = config
System.setProperty("http.proxyHost", config.getProxyHost())
System.setProperty("http.proxyPort", config.getProxyPort())
System.setProperty("https.proxyHost", config.getProxyHost())
System.setProperty("https.proxyPort", config.getProxyPort())
}
然后在每一个HttpUrlConnection请求中,设置代理服务器用户名和密码,并进行Base64加密(看你代理服务器的要求,可能因代理服务器不同而不同),代码如下
private HttpURLConnection getProxyHttpConnection() throws IOException {
String authorization = config.getProxyUser() + ":"
+ config.getProxyPassword()
URL url = new URL(config.getRequestUrl())
HttpURLConnection conn = (HttpURLConnection) url.openConnection()
conn.setRequestProperty("Proxy-Authorization",
"Basic " + Base64.encodeBase64String(authorization.getBytes()))
return conn
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)