hessian Java初探

**

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值