浏览器使用代理:Firefox浏览器:

选项->高级->连接->设置,选择手动配置代理。

自己搭建代理服务器 python 编写代理服务器_编程

实现http代理:

1.等待来自一个客户端的连接;
2.启动一个新线程来处理连接;

InputStream cis = null,sis=null; 
 OutputStream cos = null,sos=null; 
 try{ 
 csocket.setSoTimeout(TIMEOUT); 
 cis=csocket.getInputStream(); 
 cos=csocket.getOutputStream(); 
 }


上面的代码定义了代理服务器与目标服务器间套接字并初试化,其中cis为客户端输入流,sis为目标主机输入流,socket为套接字。同时设置了超时控制,如果某个Socket不可用,另一个仍旧有机会进行处理,不必创建一个新的线程。
我的类直接从Thread类继承了下来.并且通过构造函数传递引用和客户Socket建立了联系.这样每个线程就有了一个通讯管道(pipe)。同样重写run方法,把代理工作交给线程来完成。这样多客户并行的Socket就建立起来了
3.读浏览器请求的第一行(包含终点url的行);
4.解析请求第一行中终点Http服务器名及其端口号;

URL=getRequestURL(buffer); 
 int n; 
 n=URL.indexOf(“//”); 
 if (n!=-1) 
 host=URL.substring(n+2); // www.baidu.com/ 
 n=host.indexOf(‘/’); 
 if (n!=-1) 
 host=host.substring(0,n);// www.baidu.com 
 // 分析可能存在的端口号 
 n=host.indexOf(‘:’); 
 if (n!=-1) { 
 port=Integer.parseInt(host.substring(n+1)); 
 host=host.substring(0,n); 
 }


5.打开一个到终点Http服务器的套接字;

while (retry–!=0) { 
 try { 
 //与目标服务器建立连接 
 ssocket=new Socket(host,port); //尝试建立与目标主机的连接 
 break; 
 } catch (Exception e) { } 
 Thread.sleep(CONNECT_PAUSE);//线程等待几毫秒 
 }


6.通过该套接字发送/Http请求;

if(ssocket!=null){ 
 ssocket.setSoTimeout(TIMEOUT);//设置套接字超时时间 
 sis=ssocket.getInputStream(); 
 sos=ssocket.getOutputStream();//从sscoket中得到输出流 
 sos.write(buffer.getBytes()); //将请求头写入,向目标服务器输出http命令


7.发送从终点Http服务器(通过套接字)返回给浏览器请求的数据;
pipe(cis,sis,sos,cos); 这个方法用来实现套接字之间的数据交换。
8.关闭套接字,等待下一次连接。
由于关闭套接字时会抛异常,所以我用try,catch来包围代码块。

Socket 编程的客户端和服务器端主要步骤

1.编写服务器端,实例化ServerSocket对象,这里要定义ip和端口,实例化Socket,从ServerSocket对象中accept() 获取,这里要涉及到流,输入输出流在Socket中获取。
2.编写客户端,实例化Socket对象,ip,端口,流,在Socket中获取:
1.创建服务器端SocketServer,并定义SocketServer的监听端口;
2、ServerSocket调用accept( )方法,是指处于阻塞;
3、创建客户端的Socket,并设置服务器的IP和端口;
4、客户端发送连接请求,建立连接;
5、分别取得服务器和客户端Socket的InputStream和OutputStream;
6、利用Socket和ServerSocket进行数据传输

HTTP 代理服务器的基本原理:

HTTP 客户端向代理发送请求报文,代理服务器需要正确地处理请求和连接(例如正确处理 Connection: keep-alive),同时向服务器发送请求,并将收到的响应转发给客户端。

HTTP 代理服务器的程序流程图

自己搭建代理服务器 python 编写代理服务器_代理服务器_02

实现 HTTP 代理服务器的关键技术及解决方案:

理解Socket编程技术,分析HTTP代理应用程序设计原理和程序流程,选择合适的开发环境,参考已有的HTTP程序功能,设计实现HTTP代理功能的应用程序。
解决方案:Java实现socket编程并实现多线程。