Hession入门介绍

Hessian二进制协议详解

Hessian是一个用于连接网络服务的二进制协议,是Resin的开源产品。Hessian是一个非常简单的协议,使用了J2ME的设备如移动电话都可以使用它连接到Resin服务,因为它的协议简单、使用方便性及功能的强大,它也可以使用到EJB服务中。

Hessian简单使用介绍,下面的本篇文章的目录结构:

1、Hessian客户端

2、Hessian服务端

1)、在Hessian 3.0中配置依赖性注入

2)、在标准的web.xml中配置

3、Hessian序列化

4、Hessian与大二进制数据

5、Hessian的调试

6、Hessian流

7、用于移动电话的Hessian客户端

下面分别对它进行介绍:

1、Hessian客户端

在JAVA客户端中使用Hessian就相当于是调用JAVA本地方法一样,HessianProxyFactory创建代理协议的过程就像是调用一个普通的JAVA对象,如果远程连接失败,会抛出协议连接失败的异常,要使用HessianProxyFactory,要求JDK版本在1.3及以上。

每一个服务,都要求有一个普通的JAVA接口,用来描述这个服务。以下的JAV断代码hello返回的是一个字符串String类型,Hessian本身是支持序列化,因而任何JAVA类型都可以返回。

Basic服务代码:

package example; public interface Basic { public String hello(); }

以下是一个标准的Hessian客户端示例,客户中创建了一个HessianProxyFactory工厂,客户端使用这个工厂,根据提供的目标URL及为这个接口提供的API,创建客户端Stubs,返回的对象就是一个引用了接口API的Stub.

用于Basic服务的客户端代码:

package example; import com.caucho.hessian.client.HessianProxyFactory; public class BasicClient { public static void main(String []args) throws Exception { String url = "http://www.caucho.com/hessian/test/basic"; HessianProxyFactory factory = new HessianProxyFactory(); Basic basic = (Basic) factory.create(Basic.class, url); System.out.println("Hello: " + basic.hello()); } }

就是这么简单,使用客户端并不会增加程序的复杂程度,服务端的方法可以使用任何JAVA类型的参数以及任意类型的返回结果。

2、Hessian服务端

目前很多的Hessian服务端,都会使用Resin-CMP或者是Resin-EJB,因为使用这些可以使用EJB本身的优点,Hessian序列化后的二进制,使得他们可以通过扩展HessianServlet得以实现。

任何的public方法,都被认为是一个服务方法,因而在Hessian服务端中增加方法,就相当于是在一个普通的JAVA类中增加一个方法一样简单。

因为服务是作为一个Servlet引用,它可以ServletContext中你所熟悉的一些servlet数据,就像使用一个普通的servlet一样。

Hello Service源码:

package example; public class BasicService implements Basic { private String _greeting = "Hello, world"; public void setGreeting(String greeting) { _greeting = greeting; } public String hello() { return _greeting; } }

1)、在Hessian 3.0中配置依赖性注入

resin-web.xml:

<web-app xmlns="http://caucho.com/ns/resin"> <servlet servlet-name="hello" servlet-class="com.caucho.hessian.server.HessianServlet"> <init> <home resin:type="example.BasicService"> <greeting>Hello, world</greeting> </home> <home-api>example.Basic</home-api> </init> </servlet> <servlet-mapping url-pattern="/hello" servlet-name="hello"/> </web-app>

2)、在标准的web.xml中配置

既然HessianServlet是一个标准的servlet,那么他就可以配置到标准的servlet配置中。

web.xml:

<web-app> <servlet> <servlet-name>hello</servlet-name> <servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class> <init-param> <param-name>home-class</param-name> <param-value>example.BasicService</param-value> </init-param> <init-param> <param-name>home-api</param-name> <param-value>example.Basic</param-value> </init-param> </servlet> <servlet-mapping> <url-pattern>/hello</url-pattern> <servlet-name>hello</servlet-name> </servlet-mapping> </web-app>

3、Hessian的序列化

Hessian的类可以用于序列化与反序列化,Hessian的序列化是它协议成的基础,通过控制序列化,让应用程序使用Hessian比普通的应用程序的代理接口协议更加有效率。

序列化示例:

Object obj = ...; OutputStream os = new FileOutputStream("test.xml"); Hessian2Output out = new Hessian2Output(os); out.writeObject(obj); os.close();

反序列化示例:

InputStream is = new FileInputStream("test.xml"); Hessian2Input in = new Hessian2Input(is); Object obj = in.readObject(null); is.close();

当序列化的JAVA对象不是JAVA基本类型或者String时,请确认待序列化的类要继承接口java.io.Serializable。

4、Hessian与大二进制数据

当分布式应用需要发布比较大的二进制时,通过使用InputStream而避免分配大字节数组,会更有效率,只有这个方法的final参数可以是InputStream,因为在调用的过程中会读取这些数据,例如,一个文件下载服务使用Hessian会更加有效率。

在下面的示例中,客户端需要使用Hessian协议,因为代理接口会在调用返回之前,会请求缓存整个文件。

文件上传API:

package example; public interface Upload { public void upload(String filename, InputStream data); }

如果结果是InputStream,需要注意的是在finally块中别忘了加了InputStream.close(),因为Hessian只有要读出所有的数据以及数据流关闭之后,才会关闭基于HTTP流。

文件下载API:

package example; public interface Download { public InputStream download(String filename, InputStream data); }

JAVA下载代码:

InputStream is = fileProxy.download("test.xml"); try { ... // read data here } finally { is.close(); }

5、Hessian的调试

要调试Hessian需要3.1.3及以后的版本。

启动Hessian的servlet调试需要两步,第一步是将"debug"初使化参数设置到web.xml中,第二步将java.util.logging的为com.caucho.hessian.servlet的级别设置为"fine",在Resin服务中的配置看起来可能会是下面这样:

<web-app xmlns="http://caucho.com/ns/resin"> <servlet-mapping url-pattern="/my-bean" servlet-class="example.MyBean"> <init debug="true"/> </servlet-mapping> <log name="com.caucho.hessian.server" level="fine" path="stdout:"/> </web-app>

调试输出示例如下:

public class MyBean extends HessianServlet { public example.Combine combine(String a, String b) } [2007/05/08 02:51:31.000] call 2.0 [2007/05/08 02:51:31.000] method "combine" [2007/05/08 02:51:31.000] "hello" [2007/05/08 02:51:31.000] "world" [2007/05/08 02:51:31.000] reply 2.0 [2007/05/08 02:51:31.000] /* defun example.Combine [a, b] */ [2007/05/08 02:51:31.000] object example.Combine (#1) [2007/05/08 02:51:31.000] a: "hello" [2007/05/08 02:51:31.000] b: "world"

6、Hessian流

Hessian 3.1.3介绍了一个流API,应用程序可以使用流来发期周期性数据,例如Comet-style闪存监控应用中定期接受更新。

流示例代码:

import com.caucho.hessian.io.*; void send(OutputStream os) { Hessian2StreamingOutput out; out = new Hessian2StreamingOutput(os); Object data; while ((data = getNextChunk()) != null) { out.writeObject(data); } out.close(); }

流可以与Resin提供的Comet-style servlets一起使用。

7、用于移动电话的Hessian客户端

Hessian可以用于即使是非常小的JAVA设备,以下取自com.caucho.hessian.client的类,可以放到j2me.jar中:

MicroHessianInput

MicroHessianOutput

HessianRemote

HessianServiceException

HessianProtocolException

以下是一个演示了如何使用移动电话作为客户端,比使用代理要复杂一些,因为客户端需要负责建立连接,并且写数据:

Hello, world:

import javax.microedition.io.Connector; import javax.microedition.io.HttpConnection; ... MicroHessianInput in = new MicroHessianInput(); String url = "http://www.caucho.com/hessian/test/basic"; HttpConnection c = (HttpConnection) Connector.open(url); c.setRequestMethod(HttpConnection.POST); OutputStream os = c.openOutputStream(); MicroHessianOutput out = new MicroHessianOutput(os); out.call("hello", null); os.flush(); is = c.openInputStream(); MicroHessianInput in = new MicroHessianInput(is); Object value = in.readReply(null);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值