Hession和简单例子

Hessian是什么?hessian binary web service protocol

http://hessian.caucho.com/ 

Hessian is a simple binary protocol for connecting web services. The com.caucho.hessian.client and com.caucho.hessian.server packages do not require any other Server classes, so can be used in smaller clients, like applets.

Because Hessian is a small protocol. Because it's powerful, it can be used for EJB services.

    Hessian:hessian是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能,相比WebService,Hessian更简单、快捷。采用的是二进制RPC协议,因为采用了二进制协议,所以它很适合于发送二进制数据,Hessian主要作面向对象的消息通信。Hessian的初衷就是支持动态类型,格式紧凑,跨语言Hessian是使用自己的序列化机制实现的编组和反编组,其支持的数据类型是有限制的,不支持复杂的对象,可以穿透防火墙,在这里不得不说一下RMI:RMI是一组用户开发分布式应用程序的API。他使用的是java序列化机制实现调用及返回值的编组于反编组。它使用Java语言接口定义了远程对象,它集合了Java序列化和Java远程方法协议(Java Remote Method Protocol)。他可以被看做是RPC的Java版本,因为传统的RPC并不能很好的应用于分布式对象系统。而Java RMI则支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。他也有它的缺点,他只能通过RMI协议来进行访问无法通过HTTP协议访问,无法穿透防火墙。
    还有一种远程调用方法就是HttpInvoker:他也是将参数和返回值通过Java的序列化机制进行编组和反编组,它具有RMI的支持所有可序列化对象的优点。试使用Http协议传输二进制流的,同时又具有Hessian、Burlap(传输xml文本)的优点。

Hessian开放过程

▲JAVA服务器端必须具备以下几点:
·包含Hessian的jar包
·设计一个接口,用来给 客户端调用
·实现该接口的功能
·配置 web.xml,配好相应的servlet
·由于使用二进制RPC协议传输数据,对象必须进行序列化,实现Serializable 接口
·对于复杂对象可以使用Map的方法传递
▲客户端必须具备以下几点:
·java客户端包含Hessian.jar的包。C#中引用hessianCSharp.dll
·具有和服务器端结构一样的接口。包括命名空间都最好一样
·利用HessianProxyFactory调用远程接口。

Hession使用简单示例(有整理,测试的时候是在两台机器上做的,一台ubuntu虚拟机,一台win7环境。

http://blog.csdn.net/jbgtwang/article/details/30217005

服务器端:

1.接口定义

IHelloService.java

public interface IHelloService {
    public String sayHello(String name);
}

2.接口实现

IHelloServiceImpl.java

public class IHelloServiceImpl implements IHelloService {
    @Override
    public String sayHello(String name) {
        return "Hello "+name;
    }
}

3.web.xml定义

<?xml version="1.0" encoding="UTF-8" ?>
<web-app version="3.0"   
    xmlns="http://java.sun.com/xml/ns/javaee"   
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    <servlet>
        <servlet-name>helloService</servlet-name>
        <servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>
        <init-param>
            <param-name>home-class</param-name>
            <param-value>com.wangbo.hello.IHelloServiceImpl</param-value>
        </init-param>
        <init-param>
            <param-name>home-api</param-name>
            <param-value>com.wangbo.hello.IHelloService</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>helloService</servlet-name>
        <url-pattern>/hessian/HelloService</url-pattern>
    </servlet-mapping>
</web-app>

4.启动服务端

启动服务后需要自行测试一下服务器端是不是启动成功。

输入配置的地址后,可以显示出下列文字表示ok。

Hessian Requires POST

客户端实现

1.拷贝IHelloService接口

2.

import java.net.MalformedURLException;
import com.caucho.hessian.client.HessianProxyFactory;
public class Test {
    public static void main(String[] args) {

           //testHelloService1();
           testHelloService2();
    }
    private static void testHelloService1() {
        String url = "http://localhost:8080/HessianServer//hessian/HelloService";  
           HessianProxyFactory factory = new HessianProxyFactory();  
           try {
               IHelloService helloService = (IHelloService)factory.create(IHelloService.class, url);
                System.out.println(helloService.sayHello("Hesssian"));
            } catch (MalformedURLException e) {
                e.printStackTrace();
            }
    }
     private static void testHelloService2() {
        String url = "http://localhost:8080/HessianServer//hessian/HelloService";  
           HessianProxyFactory factory = new HessianProxyFactory();  
           try {
               IHelloService helloService = (IHelloService)factory.create(url);
                System.out.println(helloService.sayHello("Hesssian"));
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }   
    }
}

注意: 

1.如果使用factory.create(IHelloService.class, url);则web.xml中无需配置

       <init-param>
            <param-name>home-api</param-name>
            <param-value>com.wangbo.hello.IHelloService</param-value>
        </init-param>

2.如果使用factory.create(url);则web.xml必须配置

       <init-param>
            <param-name>home-api</param-name>
            <param-value>com.wangbo.hello.IHelloService</param-value>
        </init-param>

否则报ClassNotFoundException

3.如果使用public class IHelloServiceImpl extends HessianServlet implements IHelloService{}的方式,需要依赖servlet-api.jar,同时web.xml配置要做调整

注意事项 
1:启动tomcat的时候,出现如下问题:java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet。,而在工程中是可以找到相应的jar文件,这究竟是什么问题。 
解决方法:可能是在工程的WEB-INF/lib下面没有加载相应的jar文件。

事实是后来我改用了jetty来启动服务,避开麻烦的tomcat。

 
2:org.springframework.remoting.RemoteAccessException: Cannot access Hessian service at [http://61.152.162.173/remote/remoteService]; 
解决方法:出现这个异常一般是因为服务端操作出现异常引起的 

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

待续:Hessian in spring

+

+

+

0----finished

+

+

+

猜你喜欢

转载自fantaxy025025.iteye.com/blog/2209920