hessian Java初探

来源:互联网 发布:java首页登录开发注意 编辑:程序博客网 时间:2024/05/21 14:54

**

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进行结合,来使远程方法调用更加简单。

0 0
原创粉丝点击