当前位置:文档之家› 代理服务器的工作原理及实现

代理服务器的工作原理及实现


(上半月刊)
理工科研
户请求, 最后将本线程从线程池中取消掉。其代码如下: Public void run() { thread = Thread.currentThread(); … try { //建立输出缓冲区 if(bufout ==null){ int bufout=getServer().getClientBufferSize()-1; bufout=new ket.getOutputStream(), bufsize); } else { } bufout.reuse(socket.getOutputStream()); startConnect (new BufferedInputStream (socket.getInputstream)), new dataOutputStream (bufout)); //处理 客户请求 }catch(IOException ex){ … } }… Client 类的 startConnection()函数的具体执行过程: (1) 建立输入流剖析器, 它实现对输入信息的分析, 形 成符合 Http 格式的客户请求; (2) 执行 request=getNextReguest (), 从输入流中培析出 客户的请求 (request) ; (3) 执行 reply=processRequest(request) , 对客户请求的 处理, 产生应答 (Reply) 信息; (3) 通过 sent=emitReply(reply), 将应答信息转换成数据 流格式; (4) 调用 output.flush()实现了将当前输出缓冲区中的内 容发送给客户; (5) 最后断开连接。 处理请求 (Request) 并形成应答 (Reply) 过程是由 processRequest()函数来实现的, 该函数主要通过调用服务器对 象 (Httpd 类的实例) perform()函数来完成工作。 的 语句如下: reply=(reply)server.perform(request); 下面介绍 httpd 类中的 perform () 函数。该函数实现以 一功能: (1) 对所请求的资源进行查找, 即执行 lookup()函数, 返 回查找结果, 实际上查找结果已包括了客户请求的信息; (2) 执行 filter 的 ingoingFilter()和 outgoingFilter()函数, 对资源进行封装, 改变资源的一些属性,使得访问资源的请 求和应答得到过滤。 这样通过这一过程, 便可得到目标资源, 并以 Http 格式 返回。 三、 结束语 Jigsaw 的运行机制和实现, 提供了编程实现 Http 服务 和代理服务的方案, 对相关的开发与应用都有很大的帮助。
2006.12
Private void initializeServerSocket() { try { Class c = Class.forName(factory_class); factory = (ClientFactory) c.newInstance (); //建立一个客 户工厂 factory.initialize(this); //初始化客户工厂 }catch ( Exception ex) { … } try{ socket = factory.createServerSocket (); //创建一个 ServerSocket 的实例 }catch(IOException ex) { … } this.thread = new Thread(this); //创建一个线程, 该线程 名为 Http-Server this.thread.setName(identifier); this.thread.setPriority(thread.MAX_PRIORITY);} 上述代码中的客户工厂,它负责建立和管理一个线程 池, 该线程池中容纳了 40 个空线程, 当客户端发来一个请 求时, 就用其中的一个线程来处理该请求, 这样, 就实现了 多请求的并发处理。当请求多于 40 个时, 多出的请求将不 被接受。ServerSocket 是 Java 所提供的一个服务器端的套 接字。套接字 (Socket) 是现在网络上的两个程序通过一个 双向的通信连接实现数据交换的通道,这个双向链路的一 端称为一个 Socket, 服务器端的 Socket 称为 ServerSocket。 创建 ServerSocket 就是建立一个网络连接, 其中包括输入数 据流和输出数据流。 Http Server 是通过执行 Httpd 类中的 run()函数来实现 其服务功能, 其代码如下: Public void run() { … While((! finishing)&&(socket!=null)) { Socket ns=null; try{ //此 socket 变量为 ServerSocket 类型, 即初始化 过程中建立的 Serversocket; ns=socket.accept();//accept()函数是侦听服务端口的方 法; ns.setTcpNoDelay(true); }catch(IOException e){ … } If((socket!=null)&&(ns!=null)&&(factory!=null)) factory.handleConnection(ns); //处理客户连接 } cleanup(restarting); //若干 socket 关闭, 则清除 socket} 在 run()函数中, 利用一个循环, 不断侦听服务器端口是 否有客户请求连接,若有则处理该连接。而这一处理过程 是通过调用线程池中的线程来完成。 4.Jigsaw 作为 Proxy 服务器的工作机制 当 Http Server 侦听到其服务端口上有客户请求, 它激 活 SocketClient 类中的 run()函数, 并用线程池中一个空闲线 程来执行它,完成输出缓冲区的建立或重新使用已有的输 出缓冲区, 调用 Client 类的 startConnection () 函数来处理客
理工科研2006.12 Nhomakorabea(上半月刊)
代理服务器的工作原理及实现
□ 金湘虹 倪卫东
214121) (无锡职业技术学院
摘 要
江苏・无锡
以 Jigsaw 为例, 详细描述了 Http Proxy 的运行机制和实现方法, 其中包括 Jigsaw 配置成 Proxy 服务器、 网络资源的封 Proxy Http 协议 Socket 和 ServerSocket 资源 文献标识码: A 线程机制 文章编号: 1672-7894 2006) ( 12-178-02
参考文献:
[1]Jigsaw 文档. [2]RFC2612. [3]王克宏.Java 技术教程.清华大学出版社.
SocketOutputBuffer (soc-
装、 Http 通讯协议的实现、 Socket 及 SeverSocket 的运用以及线程机制的管理与实现。 关键词 中图分类号: O4
一、 引言 近年来, 业在世界范围内迅猛发展, IT 尤其是 Internet 网的发展更是一日千里, 联入了 Internet 的计算机数迅速增 加, 各行各业对 Internet 的依赖性不断地增强, 甚至于越来 越多的家庭也离不开 Internet。伴随着 Internet 的发展,也 不断出现一些新的技术问题, 例如 IP 地址耗尽、 网络资源争 用和网络安全等问题。代理服务器就是为了解决这些问题 而产生的一种有效的网络安全产品, 并不断地发展。 代理服务器 (Proxy) 是一种中介软件, 目的是代替内网 的客户端发出资源请求,该请求可以在代理服务器本身得 到服务,也可以传向其它服务器。代理服务器在提高网络 资源的利用率、节省网络开销以及网络安全等方面起到了 重要作用。 二、 Http Proxy 的运行机制和实现方法 1.关于 Jigsaw 就 Jigsaw 本身而言, 它是符合 HTTP/1.1 RFC 2616) ( 标 准的 Web Server。它具有以下特点: (1) 可移植性, 它无需改动就可以运行在任何支持 Java 的系统平台上; (2) 可扩展性, Jigsaw 的可扩展性体现在组成上的扩展 和功能的扩展。Jigsaw 是由一个内核和一系列扩展模块组 成, 其中, 内核是实现网络联接及网络通信的部分, Jigsaw 是 的核心组成部分。扩展模块所实现的功能是建立在网络联 接及通信之上, 如在内核上加上 HTTP 模块, 即可成为 Web Server, 在内核上加上 Proxy 模块, 即可成为 Proxy Server。 因此, 用户可以编写自己的模块, 很方便地将它动态地增加 到 Jigsaw 的内核上, 以实现特殊的功能; (3) 面向对象的设计, Jigsaw 的设计完全采用面向对象 的设计方法, 它将所有的资源及服务都作为对象来处理; (4) Jigsaw 工作在开放系统互联 (OSI) 七层模型的对话 层, 这与 Java 中的 Socket 是一致的, 因此, Jigsaw 就是利用 ServerSocket 来提供各类服务。 另外, Jigsaw 对资源 (Resources) 的定义、 资源的封装以 及提供资源的方式有它独特之处。1) ( 有关资源的概念, Jigsaw 所定义的资源不仅是包括文件和目录等物理资源, 而且
还包括虚拟资源,如代理访问的资源等,这不同与其它的 Web Server, 它们只将 CGI 脚本或文件当作服务的资源。2) ( Jigsaw 对各种原始资源进行两个不同层次的封装,先是对 资源本身的封装, 如文件资源用 FileResource 类来对文件进 行封装, 形成文件资源对象, 记录了文件的各类属性。 然后, 再在封装好的资源上,加载网络信息处理模块。这些模块 称为 Frame, 它是获取不同资源所用到的不同协议, 生成 Frame 对象, 它包括有传输内容的大小、 内容的标识等属性。 这 样做的好处在于:一是封装后的资源可以使用不同于原始 资源名的名称, 利用这一名称向外发布该资源, 这样就隐藏 了物理资源的属性,避免了一些不安全因素。二是对同一 个资源来说, 可以使用不同的协议或方法来向外发布。 2.将 Jigsaw 配置成 Proxy 服务器 由于 Jigsaw 在结构组成上是模块化的, 所以, 很容易将 它配置成代理服务器, 具体方法如下: (1)启动 Jigsaw 服务器, 再启动 Jigsaw 管理器 JigAdmin; (2) JigAdmin 中, 在 添加一个 FramedSouse 资源, 该资 源为虚拟资源; (3) ProxyFrame 将这个资源封装起来, 用 此时, 代理服 务器的基本框架就建立起来了; (4) 设置代理的内容, 并保存和执行。 这样, Jigsaw 就成了一个代理服务器。 Jigsaw 作为代理 服务器, 它也实现了服务器功能与客户端功能, 其中, 服务 器功能是由它的内核来实现, 客户端功能是由 ProxyFrame 来实现。 3.Jigsaw 的内核 Jigsaw 的内核就是一个 Http Server, Jigsaw 启动时, 当 Http 服务被创建和初始化,并以线程方式侦听和处理客户 端的访问请求。 该内核是一个 ServerHandlerManager 类, 主 要实现服务器句柄的管理,通过它可初始化和注册了两个 服务 Http Server 和 JigAdmin, 并以线程来管理它们。 Http Server 的初始化是通过调用 Http 类中的 initialize ()函数来实现的, 该函数实现了 Http Server 的属性设置和服 务器端 Socket 的建立。服务器端 Socket 的建立代码如下:
相关主题