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



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

Hessian远程访问基于序列化和反序列化的方式。当程序运行时,程序所创建的各种对象都位于内存中,当程序运行结束,这些对象就结束了生命周期。对象的序列化主要有两种用途:

l 把对象的字节序列永久地保存到硬盘上,通常是放在一个文件中。

l 在网络上传输对象的字节序列

==========================================

Hessian的学习笔记
1- 整个jar很小,200多K,3.1版本的,当然,我下载的for java的版本.
2- 配置很简单,基本上不需要花什么经历就配置出来了
3- 功能强大,可以将soap抛开,也可以把EJB抛开,采用二进制来传递对象
4- 拥有多种语言支持,python c++ .net 甚至 flex 都可以做为client端
https://www.360docs.net/doc/4014638910.html,/#Java 这里可以下载到for java的版本
任意JAVA的IDE新建一个JAVA WEB工程
将下载的.jar包引入工程中,创建一个接口,这个接口可以供客户端和服务器端使用如下:
java 代码
public interface IBasic {

/**
* 测试字符串
* @return
*/
public String hello();

/**
* 取一辆汽车 测试对象传递

* @return
*/
public Car getCar();

}

当然接口中用到的Car 这个类是自己定义的包含任何属性的标准JAVABEAN;
接下来我们就开始做service端的程序了:
java 代码
/**
* Created by IntelliJ IDEA.
* User: tangkf
*/
public class BasicService implements IBasic {
private String hello= "Hello, world";

public String hello()
{
return hello;
}

public Car getCar() {
Car car = new Car();
car.setColor("RED红色");
car.setLength("2400");
car.setName("HAHACHE");
return car;
}
}

服务器端的程序写好后,要让client能够通过http协议访问到我们的service还需要配置servlet,当然这个过程是很简单的
xml 代码

hello
com.caucho.hessian.server.HessianServlet

home-class
study.hessian.BasicService


home-api
study.hessian.IBasic




hello
/hello


只需要将上面的代码加入到你的WEB.XML文件中,当然包路径是你自己的路径而已.
这时服务器段的工作就已经全部完成了.

接下来我们在做client端的工作,client需要用到IBasic 这个接口,还需要用到 Car 这个类
可以做一个简单的测试:
java 代码
public class BasicClient {
public static void main(String []args)
throws Exception
{
String url = "http://127.0.0.1:8099/common/hello";
HessianProxyFactory factory = new HessianProxyFactory();
Basic basic = (Basic) factory.create(Basic.class, url);
Car car = basic.getCar();
System.out.println("Hello: " + basic.hello());
System.out.println("Hello: " + car.toString());
}


}

大功告成,启动我们的WEB服务器,然后在启动这个client的程序,是不是发现屏幕上输出了你想看到的结果!要是抛异常了怎么办?
不要急,检查下包路径,.xml文件的配置,没有什么神奇的地方.
我们离开了WSDL,离开了WSDD,也不需要AXIS,不需要什么W3C的大篇标准.
Hessian 简单就是美,实用就是强,好用就是王道!!!

相关文档
最新文档