java在代理服务器软件设中的应用

来源:互联网 发布:软件研发会计分录 编辑:程序博客网 时间:2024/05/16 02:06
摘 要 本文通过对Java语言网络功能及客户S/Al务器通信模式的描述,总结出代理服务器软件设      计的一般框架,最后蛤出网络管理系统中代理服务器软件的Java语言实现。  关键词 代理服务器,Java端口,线程,TCP/IP  1.引言  随着院校局域网的迅速发展,越来越多的计算机连入了因特网。与此同时,网络管理人员也面临网络安全、非法访问、IP地址耗尽、网络资源争用等问题,作 为内部私有网络和INTERNET之间网关的代理服务器可以说是解决网络管理系统中上述问题的一个有效方法。Java语言以其对网络编程的有力支持从而成 为本系统中代理服务器软件设计的首选。  2.代理服务器介绍  代理服务器对网络管理具有如下功能:  1)提高对内部网络安全保护、实现匿名访问:所有内部网的用户通过代理服务器访问Internet时,都映射为服务器的IP地址,被访问的计算机只能 “看”到代理服务器的IP地址,所以使外界不能直接访问到内部网;代理服务器还可以设置IP地址过滤,限制内部网对外部的非法访问。  2)节省IP地址开销但使用代理服务器后,只需代理服务器上有一个合法的IP地址,这样可以节约大量的IP。这对缓解目前IP地址紧张问题很有用。  3)提高访问速度。代理服务器可将用户访问过的站点加以缓存,在服务器上保留一个备份,当用户下一次访问该站点时,代理服务器就从缓存中提取出原来的备份并返回给提出请求的用户,这在用户较多且访问站点相近时可节约大量时间。  2.1 代理服务器实现原理  传统的客户机/服务器模式的消息传递过程是:随时监听相应端口的输入,作为客户机的计算机向服务器发送消息,服务器接收并处理来自客户机的消息,再把 结果以消息的形式传给客户机。在引入了代理服务器以后,实际上代理服务器是作为内部私有网络和Internet之间的一个网关,局域网内的PC通过代理服 务器实现与INTERNET的连接,当客户机(或客户程序)向位于INTERNET上的目的地址发出请求后,代理服务器分析该请求后,先查看自己缓存中是 否有请求数据,如果有就直接传送给客户端,如果没有就向客户请求的地址发出请求。当目的地址的服务器响应后,代理服务器又将该响应返回给客户机,同时在自 己的缓存中保留一份该数据的拷贝,这样,在有客户端请求相同的数据时,代理服务器就可以直接将数据传送给客户端,而不需要再向该服务器发起请求。代理服务器和局域网、Internet的关系图如图1。  2.2 代理服务9S的实现步骤  WWW的工作基于客户机/服务器计算模型,由Web浏览器和Web服务器构成,两者之间采用.HTTP协议进行通信。其监控HTTP传输的过程如下:  1)内部的浏览器发送请求给代理服务器。  2)代理服务器读取该请求,并转发给目标服务器。  3)代理服务器接收来自目标机器的应答,把应答转发给合适的内部浏览器。  3 代理服务器软件Java语言实现  3.1 Java语言网络功能概述  Java是伴随Internet.的大潮产生的。它在Internet上的应用环境实际上是一个客户机/服务器环境,也就是浏览器/服务器模型(即Browser/Server模型,简称Web模型)。  Java对网络及多线程具有内在的支持。在Java中用Java.net类库来管理网络编程的有关方法,支持多种Internet协议。可用于处理一 些基本的网络功能,包括远程登录;处理{tp、HTTP协议和WWW页面;支持HTML语言。这些网络应用通过相应的应用层协议来支持。利用Java. net类库,可以轻松编写多种类型的网络通信程序。  3.2 Java实现服务2S功能的程序设计  TCP/IP是当今最流行的协议,也是Internet的基础协议。Java对TCP/IP通信的支持是通过Socket和ServerSocket 类提供的。要建立起客户机/服务器编程模式,在服务器端必须先建立一个ServerSocket对象初始化一个端口进行监听,遇到连接呼叫,才与相应的客 户机建立连接。而在客户端软件通常使用Java.net包中的核心类Socket与服务器的某个端口建立连接,如果连接建立成功,则服务器端便会产生一个 Socket对象,然后我们就可以利用这个Socket对象跟客户机端的Socket对象沟通了。此时在服务器和客户机之间建立了一条可靠连接,客户机和 服务器可以在这条连接上可靠地传送数据。  Java实现代理服务器算法如下:  1)建立一个共有类ServerProxy,完成代理服务器的套接字设置。在Java.net类库中通过构造一个ServerSocket类的实例使 服务器能够检测到指定端口的信息。然后,可以通过给类的建造者提供一个合适的参数来建立一个ServerSocket类的实例。服务器为不同协议预留了对 应的端口。如,80端口为HTTP协议保留,21端口为FTP保留。  ServerSocket ProxySocket=null;  ProxySocket new ServerSocket(80);  2)在循环中等待一个socket前来与服务器连接,这里的关键是ServerSocket提供的方法accept()。当调用此方法并接收到用户的 连接请求后,它返回一个已进入的新连接的Socket对象,然后启动一个新的线程,以处理客户连接请求。然后等待下一个连接请求。  Socket clientSocket=null;  while(ture)  {  clientSocket=listenSocket.accept();  new newProxyTrd(clientSocket).start();  }  至此,客户机和服务器已完成连接。并生成线程。  3)服务器的具体工作由线程的run()方法完成。首先,在建立了客户机和服务器之间的连接之后,还需要为数据流建立一个仓库,streams类提供 了从一个插口读写数据的方法。它包含两个流管理器InputStream和OutputStream,前者是操作输入流的基本类,后者是其他所有类型输出 流类建立的基础。  InputStream rawDataln‘ClientSocket·getlnputStream();  OutputStream rawDataOut=ClentSocket·getOutPutStream()  4)从输入流中读取请求的第一行,该行内容包含了请求的命令关键字和目标URL。如HTTP协议的GET请求格式为:GET路径/文件名 HTTP/1.0。DatalnputStream使用户能够从流中读取基本类型的数据。例如,读取字符串时,不是从流中以字节为单位来读取,而是运用 readLine()读取。  DatalnputStream Dataln=new DatalnputStream(rawDataln);  String order=Dataln.readLine();  5)String类主要用于字符串的分析、操作及取值,利用该类提供的方法分析请求的第一行内容,得到命令关键字和服务器地址。  6)打开一个通向目标服务器(或下一个代理服务器,如合适的话)的Socket类interSocket。把请求的第一行发送到输出interSocket。可使用PrintStream类的println()方法。  PrintStream DataOut=new PrintStream(rawDataOut);  DataOut.println(””);  7)把请求的剩余部分发送到输出Socket。大多数时候,当数据到达代理服务器时,立即把它转发出去更适合高效这一要求。另外,数据的发送和接收也 可以使用多个独立的线程。特别是数据规模很大,另外创建一个线程可能具有更高的效率。可采用PipedlnputStream与类 PipedOutputStream协同工作。通过将二者连接,能够建立两个独立的线程,相互独立运行,能够以非常快的方式互相传送信息。但是线程的大量 创建与拆除消耗也很大,这是一个还有待考虑的问题。  8)把目标Web服务器返回的数据发送给发出请求的浏览器。  9)用socket类的close()方法关闭连接,  clientSocket.close();  interSocket.close();  结束语 在代理方式下,可有效解决一些院校和企业局域网所面临的保护敏感数据,控制非法访问等问题。同时,本系统的代理服务器功能还可加以扩展,实现FTP代理、POP3代理等功能,对网络的管理进一步完善。  参考文献  1 AitkenP,FriedelDHJr,Potts A.VisualJ十十程序设计.机械工业出版社,1997  2 王家俊.亲手创建Internet四大服务.人民邮电出版社,1999  3 AerganM.JAVA快速查询手册.机械工业出版社,199