hessian非常好的入门与实例教程

  • 2016-01-11
  • 浏览 (1375)

hessian是一个轻量级的remoting on http工具,使用简单的方法提供了RMI的功能,相比WebService,Hessian更简单、快捷。采用的是二进制RPC协议,因为采用了二进制协议,所以它很适合于发送二进制数据,Hessian主要作面向对象的消息通。

Hessian的初衷就是支持动态类型,格式紧凑,跨语言。Hessian是使用自己的序列化机制实现的编组和反编组,其支持的数据类型是有限制的,不支持复杂的对象,可以穿透防火墙,在这里不得不说一下RMI:RMI是一组用户开发分布式应用程序的API。他使用的是java序列化机制实现调用及返回值的编组与反编组。它使用Java语言接口定义了远程对象,它集合了Java序列化和Java远程方法协议(Java Remote Method Protocol)。他可以被看做是RPC的Java版本,因为传统的RPC并不能很好的应用于分布式对象系统。而Java RMI则支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。他也有它的缺点,他只能通过RMI协议来进行访问无法通过HTTP协议访问,无法穿透防火墙。还有一种远程调用方法就是HttpInvoker:他也是将参数和返回值通过Java的序列化机制进行编组和反编组,它具有RMI的支持所有可序列化对象的优点。是使用Http协议传输二进制流的,同时又具有Hessian、Burlap(传输xml文本)的优点。

Hessian是一个轻量级的remoting on http工具,采用的是Binary RPC协议,所以它很适合于发送二进制数据,同时又具有防火墙穿透能力。Hessian一般是通过Web应用来提供服务,因此非常类似于平时我们用的WebService。只是它不使用SOAP协议,但相比webservice而言更简单、快捷。

Hessian官网:http://hessian.caucho.com/

Hessian可通过Servlet提供远程服务,需要将匹配某个模式的请求映射到Hessian服务。也可Spring框架整合,通过它的DispatcherServlet可以完成该功能,DispatcherServlet可将匹配模式的请求转发到Hessian服务。Hessian的server端提供一个servlet基类, 用来处理发送的请求,而Hessian的这个远程过程调用,完全使用动态代理来实现的,,建议采用面向接口编程,Hessian服务通过接口暴露。

Hessian处理过程示意图:
客户端——>序列化写到输出流——>远程方法(服务器端)——>序列化写到输出流 ——>客户端读取输入流——>输出结果

1.基本代码
首先编写一个服务的接口类:HelloHessian.java
import java.util.List;
import java.util.Map;

public interface HelloHessian {

    String sayHello();     
    
    MyCar getMyCar();     
    
    List myLoveFruit();     
    
    Map myBabays();     
}
2.一个java bean文件MyCar.java:
import java.io.Serializable;

public class MyCar implements Serializable {

    private static final long serialVersionUID = 4736905401908455439L;

    private String carName;

    private String carModel;

    public String getCarName() {
        return carName;
    }

    public String getCarModel() {
        return carModel;
    }

    public void setCarName(String pCarName) {
        carName = pCarName;
    }

    public void setCarModel(String pCarModel) {
        carModel = pCarModel;
    }

    @Override
    public String toString() {
        return "my car name:[" + this.carName + "] model:[" + this.carModel + "].";
    }

}
3.服务端接口的实现类:HelloHessianImpl.java
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.caucho.hessian.server.HessianServlet;

public class HelloHessianImpl extends HessianServlet implements HelloHessian {     

    public MyCar getMyCar() {     
        MyCar car = new MyCar();     
        car.setCarName("阿斯顿·马丁");     
        car.setCarModel("One-77");     
        return car;     
    }     
    
    public Map myBabays() {     
        Map map = new HashMap();     
        map.put("son", "孙吴空");     
        map.put("daughter", "孙小美");
        map.put("son", "陈幂");  
        return map;     
    }     
    
    public List myLoveFruit() {     
        List list = new ArrayList();     
        list.add("apple");     
        list.add("kiwi");     
        list.add("orange");     
        return list;     
    }     
    
    public String sayHello() {     
        return "welcom to Hessian";     
    }     
 
}   
4.工程web.xml文件
<?xml version="1.0" encoding="UTF-8"?>  
<web-app  xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">
<servlet>    
        <servlet-name>HelloHessian</servlet-name>    
        <servlet-class>    
            com.caucho.hessian.server.HessianServlet     
        </servlet-class>    
        <init-param>    
            <param-name>home-class</param-name>    
            <param-value>demo.hession.HelloHessianImpl</param-value>    
        </init-param>    
        <init-param>    
            <param-name>home-api</param-name>    
            <param-value>demo.hession.HelloHessian</param-value>    
        </init-param>    
        <load-on-startup>1</load-on-startup>    
</servlet>    
<servlet-mapping>    
        <servlet-name>HelloHessian</servlet-name>    
        <url-pattern>/HessianService</url-pattern>    
</servlet-mapping>    

</web-app>   
5.java客户端验证代码
import java.net.MalformedURLException;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

import com.caucho.hessian.client.HessianProxyFactory;

public class HessianClientTest {

    public static void main(String[] args) {     
           String url = "http://localhost:8080/HessianService";     
           HessianProxyFactory factory = new HessianProxyFactory();     
           try {     
               HelloHessian hello = (HelloHessian) factory.create(     
                       HelloHessian.class, url);     
               System.out.println(hello.sayHello());     
       
               MyCar car = hello.getMyCar();     
               System.out.println(car.toString());     

               Map babies = hello.myBabays();
               Iterator it = babies.entrySet().iterator();
               while(it.hasNext()){
                   Entry entry = (Entry)it.next();
                   System.out.println(entry.getKey() + "    " + entry.getValue());
               }
       
           } catch (MalformedURLException e) {     
               e.printStackTrace();     
           }     
       
       }     
}
6.验证结果:
welcom to Hessian
my car name:[阿斯顿·马丁] model:[One-77].
daughter    孙小美
son    陈幂
转自:http://ribbonchen.blog.163.com/blog/static/118316505201472024252460/
0  赞