ckwang17 发表于 2013-1-28 18:07:58

Hessian

一、简介
       Hessian是由caucho提供的一个基于binary-RPC实现的远程通讯library。
  1、是基于什么协议实现的?
           基于Binary-RPC协议实现。
  2、怎么发起请求?
           需通过Hessian本身提供的API来发起请求。
  3、怎么将请求转化为符合协议的格式的?
           Hessian通过其自定义的串行化机制将请求信息进行序列化,产生二进制流。
  4、使用什么传输协议传输?
           Hessian基于Http协议进行传输。
  5、响应端基于什么机制来接收请求?
           响应端根据Hessian提供的API来接收请求。
  6、怎么将流还原为传输格式的?
           Hessian根据其私有的串行化机制来将请求信息进行反序列化,传递给使用者时已是相应的请求信息对象了。
  7、处理完毕后怎么回应?
           处理完毕后直接返回,hessian将结果对象进行序列化,传输至调用端。
二、Hessian 调用实例
a)         编写服务端代码
写一个接口:
public interface Hello {
    public String seeHello();
}
编写一个实现:
public class HelloImpl implements Hello {
 
    private String helloStr = “Hello World”;
 
    public String getHelloStr() {
       return helloStr;
    }
 
    public void setHelloStr(String helloStr) {
       this.helloStr = helloStr;
    }
 
    public String seeHello() {
       return helloStr;
    }
 
}
配置WEB-INF.xml 部署到Web容器中:
         <servlet>  
             <servlet-name>hello</servlet-name>  
             <servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>  
             <init-param>  
                 <param-name>home-class</param-name>  
                 <param-value>com.alisoft.enet.hessian.HelloImpl</param-value>  
             </init-param>  
             <init-param>  
                 <param-name>home-api</param-name>  
                 <param-value>com.alisoft.enet.hessian.Hello</param-value>  
             </init-param>  
         </servlet>       
  
         <servlet-mapping>  
             <servlet-name>hello</servlet-name>  
             <url-pattern>/hello.xsp</url-pattern>  
         </servlet-mapping> 
            Ok,服务端代码编写完毕。
        
b)         编写客户端代码
 
public class HelloServiceTest {
 
  public static void main(String[] args) throws Exception {
    
     String url = “http://localhost/hessian/hello.xsp”;
 
     HessianProxyFactory factory = new HessianProxyFactory();
     Hello hello = (Hello) factory.create(Hello.class, url);
 
     System.out.println(“远程调用结果: “ + hello.seeHello());
 
  }
}
 
         执行客户端,即可返回相应的结果:
                   远程调用结果: Hello World        
         上面的例子是基于 caucho 提供的Hessian 包的基础上做的,实际上Spring的Hessian调用只是对这个进行简单的封装,便于使用。
  
三、Hessian机制
 
 
 
http://leeqianjun.iteye.com/upload/picture/pic/26089/ce44864e-21af-3200-9535-e7f82329854d.bmp
  那么Hessian就是把Java对象转变成 字节序列,然后通过Http传输到 目标服务器上(主机2),主机2收到这个字节序列后,按照一定的协议标准进行反序列,提交给对应的服务处理。处理完成以后以同样的方式返回数据。
 
现在我们回头看看例子中的配置(WEB-INF.XML):
配置的Servlet: com.caucho.hessian.server.HessianServlet
对应的参数:接口(home-api):com.alisoft.enet.hessian.Hello
                            实现(home-class): com.alisoft.enet.hessian.HelloImpl
 
 
 
HessianServlet 中的实现代码如下(略过部分代码):
 
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
InputStream is = request.getInputStream();
OutputStream os = response.getOutputStream();
//输入流
Hessian2Input in = new Hessian2Input(is);
SerializerFactory serializerFactory = getSerializerFactory();
in.setSerializerFactory(serializerFactory);
//输出流
AbstractHessianOutput out;
int major = in.read();
int minor = in.read();
out = new Hessian2Output(os);
out.setSerializerFactory(serializerFactory);
_homeSkeleton.invoke(in, out);
 
整个执行步骤如下:
l  接收输入流,并通过SerializerFactory转化为 Hessian 特有的 Hessian2Input
l  设置输出流,并通过SerializerFactory转化为 Hessian 特有的 Hessian2Output
l  根据配置的接口和实现参数,调用服务,并把结果写入到输出流 Hessian2Output中
l   Out.close()
 
Hessian远程访问基于序列化和反序列化的方式。当程序运行时,程序所创建的各种对象都位于内存中,当程序运行结束,这些对象就结束了生命周期。对象的序列化主要有两种用途:
l  把对象的字节序列永久地保存到硬盘上,通常是放在一个文件中。
l  在网络上传输对象的字节序列
页: [1]
查看完整版本: Hessian