Hessian是采用二进制流进行通讯的,性能应该会好一些,不过既然通过二进制流传递,是不是对复杂对象的传递有问题呢,毕竟传递过程中没有象soap这样保留了对象的结构的。这个问题有待以后考证。
和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去捕捉实际传递的内容,发现根本看不懂传递的内容,因为是以二进制流进行传递的。