昨天写了一篇关于 ICE 的接口如何实现的文章,突然想到我们今年接口测试过程中可能也会遇到 hessian 类型的接口,为此乘这两天有空把 hessian 接口也学习一下。由于学习是为了以后测试工作而进行的,所以对于 hessian 和 soap 机制孰优孰劣就没有深入的研究,这些问题还是留给我们架构师来研究吧。根据网上的文献: Hessian 是采用二进制流进行通讯的,所以我想性能应该会好一些,既然通过二进制流传递,是不是对复杂对象的传递有问题呢,我想可能会有些难度,毕竟传递过程中没有象 soap 这样保留了对象的结构的。这个问题有待以后考证。今天我想把我第一次学习 hessian 的经历分享一下。
和 ICE,WebService 一样,既然作为服务类那么必须有文档公布它的接口形式,客户端用户在通过这个文档来生成代理类。 ICE 是通过 .Ice 文件, WebService 是通过 wsdl ,但是 hessian 没有这个类型的文档, hessian 的代理类是直接通过 factrory 去生成的。所以在做 hessian 客户端代码之前,需要拿到接口文件 interface 。下面我们通过一个完整的例子看看 hessian 服务器端代码和客户端代码如何实现。
服务器端代码和配置:
1. 去 http://hessian .caucho.com/#Java 下载 hessian jar 包。
2. 新建服务器端工程 (web 工程 :hessian) ,新增接口声明文件 new->interface 。代码如下:
1 package Hessian; 2 3 public interface Printer { 4 public String printstr(); // 与服务端的 printstr 方法对应 5 } |
3. 新建服务器类实现代码 ,new->class, 代码如下
01 package Hessian; 02 03 public class PrinterService implements Printer{ 04 05 public String printstr() { 06 // TODO Auto-generated method stub 07 return "helloworld"; 08 } 09 10 } |
4. 修改服务器端 web.xml 文件如下
<? xml version = "1.0" encoding = "UTF-8" ?> < web-app > < servlet > < servlet-name > aaa </ servlet-name > < servlet-class > com.caucho.hessian.server.HessianServlet </ servlet-class > < init-param > < param-name > home-class </ param-name > < param-value > Hessian.PrinterService </ param-value > </ init-param > < init-param > < param-name > home-api </ param-name > < param-value > Hessian.Printer </ param-value > </ init-param > </ servlet > < servlet-mapping > < servlet-name > aaa </ servlet-name > < url-pattern > /aaa </ url-pattern > </ servlet-mapping > </ web-app > |
上述代码实现如下功能 :
* 指定接口的 url
* 指定 API 使用的 inteface 文件
* 指定服务器类实现的代码
5. 导出工程为 hessian.war ,部署到 tomcat5 的 webapps 目录下。
6. 将 hessian jar 包拷贝到 lib 目录下。
客户端代码:
1. 新建客户端工程,新增测试类,代码如下
01 package Hessian; 02 03 import com.caucho.hessian.client.HessianProxyFactory; 04 05 public class TestClient { 06 public static void main(String []args) 07 throws Exception 08 { 09 String url = "http://10.0.68.183:8080/Hessian/aaa"; 10 // 创建 factory 实例 11 HessianProxyFactory factory = new HessianProxyFactory(); 12 // 客户端需实现 Basic 接口 13 Printer printer = (Printer) factory.create(Printer.class, url); 14 15 System.out.println("Hessian: " + printer.printstr()); 16 } 17 18 } |
运行客户端代码:可以看见 Hessian helloworld 。
如果读者有兴趣使用 comview 去捕捉实际传递的内容,发现根本看不懂传递的内容,因为是以二进制流进行传递的。
来源:http://blog.csdn.net/linkyou/archive/2009/02/03/3859734.aspx