一、 简介
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机制
那么 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 在网络上传输对象的字节序列