比WebService更简单的远程调用方案框架:Hessian

来源:互联网 发布:js判断是否为json对象 编辑:程序博客网 时间:2024/06/05 23:39
  Hessian是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能. 相比WebService,Hessian更简单、快捷。采用的是二进制RPC协议,因为采用的是二进制协议,所以它很适合于发送二进制数据。
    hessian类似于Webservice,但是它不使用soap协议,它把协议报文封装到http封包中,通过HTTP信道传输。是一种高效简洁的远程调用框架,它采用的是二进制RPC协议(Binary),具有轻量、传输量小、平台无关的特点,特别适合于目前网络带宽比较小的手机网络应用项目。 Hessian是通过servlet提供远程服务,完全使用动态代理来实现的,推荐采用面向接口编程,因此,Hessian服务建议通过接口暴露。 hessian已经支持Java,Flash/Flex,Python,C++,.NET C#,D,Erlang,PHP,Ruby,Objective C。其中我最喜欢的就是它不需要我们与xml“打交道”,直接操作对象,省去了很多麻烦。
    缺点:如果service层中返回的对象是复杂对象,使用它就会削弱Hessian的传输量小的优点,而且也会增加Hessian客户端的代码量。既然它是把对象序列化为二进制流的形式在http信道中传输,那么对于安全性高的应用不应该采用hessian(比如网上支付等)、
    官方简介:Hessian 是一个二进制协议,提供web 服务就像创建Servlet一样简单. 使用服务就像使用JDK代理接口一样简单
com.caucho.hessian.client
com.caucho.hessian.server  并不是必须的,可以使用简单的客户端,比如applets.

    Hessian 介绍
注意事项
  在进行基于Hessian的项目开发时,应当注意以下几点:
  ▲JAVA服务器端必须具备以下几点:
  ·包含Hessian的jar包
  ·设计一个接口,用来给客户端调用
  ·实现该接口的功能
  ·配置web.xml,配好相应的servlet
  ·对象必须实现Serializable 接口
  ·对于复杂对像可以使用Map的方法传递
  ▲客户端必须具备以下几点:
  ·java客户端包含Hessian.jar的包。C#中引用hessianCSharp.dll
  ·具有和服务器端结构一样的接口。包括命名空间都最好一样
  ·利用HessianProxyFactory调用远程接口。
  简单JAVA客户端例子:

服务器端
  新建一个名EasyHession的webProject项目,将Hessian.jar放入web-inf下的lib中
  创建接口:
  packageapp.demo;
  public interfaceBasicAPI {
  public void setGreeting(Stringgreeting);
  public String hello();
  public User getUser();
  }
  实现接口:
  packageapp.demo;
  publicclass BasicService implements BasicAPI {
  privateString _greeting = "Hello, world";
  public void setGreeting(String greeting)
  {
  _greeting = greeting;
  System.out.println("set greetingsuccess:"+_greeting);
  }
  public String hello()
  {
  return _greeting;
  }
  public User getUser() {
  return new User("prance", "meshow");
  }
  }
  创建一个实现Serializable的projo类也可以是Bean。
  package app.demo;
  import java.io.Serializable;
  public class User implements Serializable{
  String userName ="snoopy";
  String password ="showme";
  public User(Stringuser, String pwd) {
  this.userName =user;
  this.password= pwd;
  }
  public StringgetUserName() {
  returnuserName;
  }
  public StringgetPassword() {
  returnpassword;
  }
  }
  接下来是配置web.xml
  <?xml version="1.0"encoding="UTF-8"?>
  <web-app version="2.4"
  xmlns="http://java.sun.com/xml/ns/j2ee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
  http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  <servlet>
  <servlet-name>hello</servlet-name>
  <servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>
  <init-param>
  <param-name>service-class</param-name>
  <param-value>app.demo.BasicService</param-value>
  </init-param>
  </servlet>
  <servlet-mapping>
  <servlet-name>hello</servlet-name>
  <url-pattern>/hello</url-pattern>
  </servlet-mapping>
  </web-app>
  为了测试可以在编辑一个简单的test.jsp
  <%@ pageimport="com.caucho.hessian.client.HessianProxyFactory,
  app.demo.BasicAPI"%>
  <%@page language="java"%>
  <%
  HessianProxyFactory factory = newHessianProxyFactory();
  String url = ("http://" +request.getServerName() + ":" +request.getServerPort() +
  request.getContextPath() + "/hello");
  out.println(url);
  BasicAPI basic = (BasicAPI) factory.create(BasicAPI.class,url);
  out.println("Hello: " + basic.hello());
  out.println("Hello: " + basic.getUser() .getUserName() );
  out.println("Hello: " +basic.getUser().getPassword() );
  %>
  将一切配置成功后,将项目发布到web 服务器上去,可以是Tomcat,Rain等等。
  进入
  结果如下:
  Hello: Hello, world
  Hello: snoopy
  Hello: showme
  说明服务器端已经编写成功。

java客户端
  创建一个名为HessianClient的JAVAProject,载入hessian.jar包
  创建与服务器端一样的接口,及基础类
  public interface BasicAPI{
  public void setGreeting(Stringgreeting);
  public String hello();
  public User getUser();
  }
  import java.io.Serializable;
  public class User implements Serializable{
  String userName ="snoopy";
  String password ="showme";
  public User(Stringuser, String pwd) {
  this.userName =user;
  this.password= pwd;
  }
  public StringgetUserName() {
  returnuserName;
  }
  public StringgetPassword() {
  returnpassword;
  }
  }

创建客户端程序
  importcom.caucho.hessian.client.HessianProxyFactory;
  public class BasicClient {
  public static void main(String[] args)
  throwsException
  {
  String url ="http://127.0.0.1:8080/Hessian/hello";
  HessianProxyFactoryfactory = new HessianProxyFactory();
  BasicAPIbasic = (BasicAPI) factory.create(BasicAPI.class, url);
  System.out.println("Hello:" + basic.hello());
  System.out.println("Hello:" + basic.getUser().getUserName());
  System.out.println("Hello:" + basic.getUser().getPassword());
  basic.setGreeting("HelloGreeting");
  System.out.println("Hello:" + basic.hello());
  }
  }
  运行结果
  Hello: Hello, world
  Hello: prance
  Hello: meshow
  Hello: Hello Greeting