**
1. hessian简介
**
首先简单介绍下hessian,hessian是一个轻量级的remoting onhttp工具,类似于webService,但是hessian不是使用soap协议,他是基于自己的hessian协议(二进制RPC协议),具有轻量、传输量小、快速、平台及语言无关性等特点。hessian将协议报文封装到http封包中,通过HTTP信道进行传输,是一种高效的远程调用框架。hessian现在已经支持java,Python,C++,.NET,PHP,Ruby,Objective C等。
**
2. hessian通信
**
Hessian通过客户端API类HessianProxyFactory去发出请求http请求,通过hessian自己的序列化机制对请求信息进行序列化机制,产生二进制的流,服务器端主要通过HessianServlet这个类对请求进行处理,接收到请求后服务器端进行反序列化操作,将请求数据解析出来,然后在服务器端对数据进行进行操作(比如常见的数据库CRUD操作),然后将要返回的结果进行序列化c成二进制流,传输到客户端。
**
3. hessian 简单java实例
**
首先,我们来看看hessian该如何使用,从简单的hello world开始。
首先我们要定义一个接口:
public interface IHelloService {
public void sayHello();
public void getSayName(String name);
public void setUserInfo(String name,String pwd,int age,Date birthday);
public UserDTO getUser();
}
然后是接口的实现类:
public class HelloServiceImpl implements IHelloService{
private UserDTO dto;
@Override
public void sayHello() {
// TODO Auto-generated method stub
System.out.println("say Hello");
}
@Override
public void getSayName(String name) {
// TODO Auto-generated method stub
System.out.println("say " + name);
}
@Override
public void setUserInfo(String name,String pwd,int age,Date birthday) {
// TODO Auto-generated method stub
this.dto = new UserDTO(name, pwd, age, birthday);
}
@Override
public UserDTO getUser() {
// TODO Auto-generated method stub
return dto;
}
}
定义的dto:
public class UserDTO implements Serializable{
private String name;
private String password;
private int age;
private Date birthday;
public UserDTO() {
// TODO Auto-generated constructor stub
}
public UserDTO(String name, String password, int age, Date birthday) {
super();
this.name = name;
this.password = password;
this.age = age;
this.birthday = birthday;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
@Override
public String toString() {
return "UserDTO [name=" + name + ", password=" + password + ", age="
+ age + ", birthday=" + birthday + "]";
}
}
注意在dto中一定要实现Serializable接口,否则,客户端调用时就会报错。
接下来就可以在web.xml中配置HessianServlet,刚刚说过这个类作为服务器端接收请求的类,他是一个Servlet,所以和其他的Servlet配置一样:
<servlet>
<servlet-name>hessianServer</servlet-name>
<servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>
<!-- 接口 -->
<init-param>
<param-name>home-api</param-name>
<param-value>com.remoting.hessian.service.IHelloService</param-value>
</init-param>
<!-- 其实现类 -->
<init-param>
<param-name>home-class</param-name>
<param-value>com.remoting.hessian.service.impl.HelloServiceImpl</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>hessianServer</servlet-name>
<url-pattern>/remoting/hello</url-pattern>
</servlet-mapping>
这样服务器端就开发完了,其中HelloServiceImpl只是简单打印结果,一般项目中最可能就是对数据库进行操作了。接着启动服务器,等待客户端的调用。
好了,接下来看看hessian客户端如何调用的:
public class clientTest {
private String url = "http://localhost:8080/HessianServer/remoting/hello";
private IHelloService service = null;
@Before
public void init() throws MalformedURLException, ClassNotFoundException{
HessianProxyFactory proxyFactory = new HessianProxyFactory();
service = (IHelloService)proxyFactory.create(IHelloService.class, url);
}
@Test
public void sayHello(){
service.sayHello();
}
@Test
public void getSayName(){
service.getSayName("tangfeng");
}
@Test
public void getUser(){
service.setUserInfo("tf", "wwf", 23, new Date());
System.out.println(service.getUser());
}
}
这里主要是使用HessianProxyFactory这个类跟服务器端进行交互,HessianProxyFactory.create()方法将会产生一个HessianProxy这个代理类,此类实现了InvocationHandler接口,JDK的Proxy将会自动调用InvocationHandler的实现类(此处为HessianProxy)。HessianProxy的invoke方法中就是通过HttpURLConnection跟服务器端进行交互。此处比较复杂,将会在接下来的文章对Hessian的源码进行分析。
**
4. 总结
**
Hessian是基于二进制的RPC协议实现的,是根据hessian自己的api类发出请求,并通过自己的序列化机制对请求信息进行序列化操作产生二进制流,他是基于HTTP协议进行传输的。在服务器端hessian也是通过自己的api类来进行接收请求,并将请求得到的数据进行反序列化,传递给使用者时已经时序列化好可用的信息,通过服务器端的一系列操作,然后将结果序列化返回给客户端。
这里通过一个小的java实例,来感受hessian的远程方法调用。在客户端,调用服务器远程方法就像在本地调用一样,而且面向接口编程,能带来更大的灵活性。好了,小小的实例就写到这里,下篇我们来看看怎么和spring进行结合,来使远程方法调用更加简单。