Socket编程--自己动手的HTTP代理服务器

来源:互联网 发布:淘宝网涵元服饰 编辑:程序博客网 时间:2024/06/02 07:48

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

选项->高级->连接->设置,选择手动配置代理。
浏览器使用代理

实现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 代理服务器的程序流程图

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

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

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

0 0