Hessian 学习笔记

来源:百度文库 编辑:神马文学网 时间:2024/04/28 05:02:53

一、简介

       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容器中:

           

             hello  

             com.caucho.hessian.server.HessianServlet  

               

                 home-class  

                 com.alisoft.enet.hessian.HelloImpl  

               

               

                 home-api  

                 com.alisoft.enet.hessian.Hello  

               

                

  

           

             hello  

             /hello.xsp  

          

            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机制

 

 

  那么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()