摘要
基于java平台的企业应用可以通过java隧道技术实现应用在因特网上部署。java隧道技术用现有的web server和servlet容器就可以建立java消息隧道和远程方法调用。由于基于http协议,所以java隧道是防火墙透明的隧道。java隧道技术对于基于java平台的因特网企业应用是一个不错的选择。
1.引言
在以因特网为基础的企业应用中,穿越防火墙是企业应用系统必须面对的问题。而http协议是唯一一个可以在因特网中自由来往的协议,防火墙只有对http访问是透明的,其它协议都会被挡在防火墙之外。web service正是基于这个原因,采用http完成异构企业应用在因特网上的整合。本文提出一个方案,可以使基于java平台的企业应用不必等待web service的渐渐成熟,而利用java隧道技术实现在因特网上的企业应用部署。
java隧道技术不是一个新的技术,它是java对象序列化和web技术的结合。2001年笔者就曾经做过基于java隧道的试验。关于java servlet的书籍也有对java隧道技术的相关论述(参考文献[2])。本文首先回顾一下java隧道技术的基本原理,再通过一个实例来实现它。以此为后面的java隧道回调技术和基于java隧道技术的因特网通讯打下基础。
本文的内容可以用于java web start客户端在因特网上的部署,可以用于利用因特网互连的java应用服务。
2.java隧道通讯
web service技术中的soap协议(simple object application protocol),简单的说是把对象用xml来序列化和反序列化的协议。xml表述的好处就是平台的独立性,不管对象在不同的平台中表现的形式是什么样的,最终都可以用xml来实现对象的互换。并且,基于http协议的web service可以穿越防火墙。 web service技术整合因特网上的应用是它的强项。web service技术是一个很好的创意,包括ibm,microsoft,sun等公司都极力推出自己的相关产品。我们可以说,在未来的异构平台的集成,b2b应用中,web service将发挥重要的作用。
然而,对于java平台的企业应用,你可以用web service相同的原理,利用java平台的对象序列化,再借助web技术,完成因特网上的应用部署。这样的技术就是java的隧道技术。因为这个技术都是利用现有的基础技术来实现的,所以可以非常容易的完成系统的构架。当然java隧道与web service的定位是完全不同的,他们应该用在不同的场合。web service更加强大,更加通用化,是一套新兴的互相访问的标准。也正是由于web service的强大,所以它也更复杂。回答下面的问题,来看看你需要哪种技术来构架你的应用:
- 1.互连的系统是否都是java平台?
- 2.是否要在internet上部署?
- 3.是否要穿越防火墙?
如果第一个问题的答案是"否",其它问题回答"是",那么你别无选择,必须用web server技术;如果以上的问题的回答都是"是"的话,你可以用web service来构架系统,当然,你也可以用更便捷,简单,高效的java隧道技术。
java隧道技术的基本构架如下图。java隧道系统的通讯构架,由web server提供http服务,servlet容器处理java序列化对象。对于这样的一个框架,我们可以用常见的tomcat,jetty等软件作为java隧道技术的运行基础环境。
java隧道技术的基本工作原理是这样的:首先,java客户端把对象序列化,用http协议包装序列化对象的字节流在internet上传播,透过防火墙,提交到web server上。servlet容器把http协议剥离开,取出序列化的对象,再反序列化这个java对象,传递给后台的应用。
整个工作过程,就是把java序列化对象,通过http协议的包装完成在internet上的通讯。由于java序列化技术是java 1.1版本后内置的功能,只要实现java.io.serializable接口就可以实现。而集成web server的servlet容器更是有好多实现,这里也不乏开源的优秀产品,如tomcat,jetty等。这些都体现了java隧道技术构架的简便性。
下面我们通过一根例子来看看java隧道技术是如何具体实现的。
3.实例
这里我们选择jetty(jetty 4.2.21)作为web server和java servlet的运行容器。编写普通的java应用程序tunnelclient作为java隧道的客户端。编写servlet程序tunnelserver作为java隧道的服务端。如下图,运行java隧道客户端程序,在程序内部调用隧道服务http://127.0.0.1:8080/servlets/servlet/tunnelserver。从服务器返回对象,对象内容打印在控制台上。
如下图,是jetty服务器中tunnelserver的运行情况,我们可以看到tunnelserver从客户端获得的对象内容的屏幕打印。
从下面隧道服务器程序tunnelserver的代码中我们可以看到,隧道服务首先是一个servlet程序,tunnelserver继承于java.servlet.httpservlet。隧道中的对象传递是通过java.io.objectinputstream, java.io.objectoutstream来实现的。被传递的对象,首先必须是可以序列化的对象,就是说必须实现java.io.serializable接口。例子代码中的msg类就是一个实现了java.io.serializable接口的类。msg对象通过java.io.objectinputstream, java.io.objectoutstream实现了对象的远程传递。由于tunnelserver继承于java.servlet.httpservlet,所以对象的传递是基于http协议的。对象的远程传递可以透过防火墙正是因为通过http协议传输的结果。
从下面隧道客户端程序tunnelclient的代码中我们可以看到,其工作原理与java隧道服务端的完全相同。客户端的java.io.objectinputstream,,java.io.objectoutstream分别对应服务端的java.io.objectoutstream ,java.io.objectinputstream。客户端与服务端形成了一个对象传输的管道。
在java隧道中我们可以增加加密技术来保证传递信息在internet上的安全传递。在对象进入通道之前,可以用加密密钥对对象流先加密(我们假设用非对称加密算法,当然可以根据加密强度的要求用不同的加密算法和密钥长度),再送入通道中;在接收到加密对象流之后,先用解密密钥对对象流解密,再还原为对象实例。
这里要注意,无论是在服务端还是在客户端,都必须包含msg类的class文件,而且msg在两端必须要一致。因为隧道的一端要实例化msg对象,另一端要从io中获得对象流,再用msg类来造型(cast)。
4.结束语
java隧道技术如此简单,无论是代码的编写,还是运行环境的组建,都非常容易。正是因为java隧道技术的简单性,才使我们可以方便的把这个技术集成到应用系统中。然而,简洁不代表功能的简单,基于这个技术,可以实现基于http的对象消息传递和远程方法调用,并且穿越防火墙。java隧道技术为java平台的应用在因特网上的部署提供了一个简单,高效的方案。
参考文献
- [1] jetty,version 4.2.21, web server and servlet container by java, http://jetty.mortbay.org
- [2] karl moss, "java servlet second edition", mcgraw-hill companies, 2000
- [3] simple object access protocol, http://www.w3.org
- [4] web servide, http://www.w3.org
闽公网安备 35060202000074号