`
sjsky
  • 浏览: 921575 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

小试Hessian实现webservice

阅读更多
    blog迁移至:http://www.micmiu.com

Hessian是一个轻量级的remoting on http工具,采用的是Binary RPC协议,所以它很适合于发送二进制数据,同时又具有防火墙穿透能力。Hessian一般是通过Web应用来提供服务,因此非常类似于平时我们用的WebService。只是它不使用SOAP协议,但相比webservice而言更简单、快捷。

Hessian官网:http://hessian.caucho.com/

Hessian可通过Servlet提供远程服务,需要将匹配某个模式的请求映射到Hessian服务。也可Spring框架整合,通过它的DispatcherServlet可以完成该功能,DispatcherServlet可将匹配模式的请求转发到Hessian服务。Hessian的server端提供一个servlet基类, 用来处理发送的请求,而Hessian的这个远程过程调用,完全使用动态代理来实现的,,建议采用面向接口编程,Hessian服务通过接口暴露。

Hessian处理过程示意图:
客户端——>序列化写到输出流——>远程方法(服务器端)——>序列化写到输出流 ——>客户端读取输入流——>输出结果

下面详细介绍最常用的两种方式实现Hessian提供webservice:
  • 纯Hessian实现
  • 配合Spring框架实现

在开始之前当然需要到官网上下载相关的lib包,放入项目的/WEB-INF/lib/下
【一】、纯Hessian实现步骤:
1.基本代码
首先编写一个服务的接口类:HelloHessian.java
package michael.hessian;
import java.util.List;
import java.util.Map;

/**
 * @author michael
 * 
 */
public interface HelloHessian {

    String sayHello();

    MyCar getMyCar();

    List<String> myLoveFruit();

    Map<String, String> myBabays();

}

一个java bean文件MyCar.java:
package michael.hessian;

import java.io.Serializable;

/**
 * @author michael
 * 
 */
public class MyCar implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 4736905401908455439L;

    private String carName;

    private String carModel;

    /**
     * @return the carName
     */
    public String getCarName() {
        return carName;
    }

    /**
     * @return the carModel
     */
    public String getCarModel() {
        return carModel;
    }

    /**
     * @param pCarName the carName to set
     */
    public void setCarName(String pCarName) {
        carName = pCarName;
    }

    /**
     * @param pCarModel the carModel to set
     */
    public void setCarModel(String pCarModel) {
        carModel = pCarModel;
    }

    /**
     * @see java.lang.Object#toString()
     * @return
     */
    @Override
    public String toString() {
        return "my car name:[" + this.carName + "] model:[" + this.carModel
                + "].";
    }

}

服务端接口的实现类:HelloHessianImpl.java
package michael.hessian.impl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import michael.hessian.HelloHessian;
import michael.hessian.MyCar;

/**
 * @author michael
 * 
 */
public class HelloHessianImpl extends HessianServlet implements HelloHessian {

    public MyCar getMyCar() {
        MyCar car = new MyCar();
        car.setCarName("阿斯顿·马丁");
        car.setCarModel("One-77");
        return car;
    }

    public Map<String, String> myBabays() {
        Map<String, String> map = new HashMap<String, String>();
        map.put("son", "孙吴空");
        map.put("daughter", "孙小美");
        return map;
    }

    public List<String> myLoveFruit() {
        List<String> list = new ArrayList<String>();
        list.add("apple");
        list.add("kiwi");
        list.add("orange");
        return list;
    }

    public String sayHello() {
        return "welcom to Hessian";
    }

}

2.配置文件web.xml修改
在web.xml配置文件里增加如下信息:
<servlet>
		<servlet-name>HelloHessian</servlet-name>
		<servlet-class>
			com.caucho.hessian.server.HessianServlet
		</servlet-class>
		<init-param>
			<param-name>home-class</param-name>
			<param-value>michael.hessian.impl.HelloHessianImpl</param-value>
		</init-param>
		<init-param>
			<param-name>home-api</param-name>
			<param-value>michael.hessian.HelloHessian</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>HelloHessian</servlet-name>
		<url-pattern>/HessianService</url-pattern>
	</servlet-mapping>
	<servlet-mapping>

3.java客户端验证
package michael.hessian.client;

import java.net.MalformedURLException;
import java.util.Map;

import michael.hessian.HelloHessian;
import michael.hessian.MyCar;

import com.caucho.hessian.client.HessianProxyFactory;

/**
 * @author michael
 *
 */
public class HessianClientTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        String url = "http://localhost:8082/J2EE_sjsky/HessianService";
        HessianProxyFactory factory = new HessianProxyFactory();
        try {
            HelloHessian hello = (HelloHessian) factory.create(
                    HelloHessian.class, url);
            System.out.println(hello.sayHello());

            MyCar car = hello.getMyCar();
            System.out.println(car.toString());

            for (Map.Entry<String, String> entry : hello.myBabays().entrySet()) {
                System.out.println(entry.getKey() + "   " + entry.getValue());
            }

            for (String str : hello.myLoveFruit()) {
                System.out.println(str);
            }

        } catch (MalformedURLException e) {
            e.printStackTrace();
        }

    }

}

运行结果如下:
welcom to Hessian
my car name:[阿斯顿·马丁] model:[One-77].
daughter   孙小美
son   孙吴空
apple
kiwi
orange


【二】、spring+hessian 实现服务端:
1.基本代码见上面的demo
2.修改配置文件
  在web.xml,增加内容如下:
<servlet>
		<servlet-name>springhessian</servlet-name>
		<servlet-class>
			org.springframework.web.servlet.DispatcherServlet
		</servlet-class>
		<!-- 
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>/WEB-INF/springhessian-servlet.xml</param-value>
		</init-param>
		 -->
		<load-on-startup>1</load-on-startup>
	</servlet>

	<servlet-mapping>
		<servlet-name>springhessian</servlet-name>
		<url-pattern>/springhessian/*</url-pattern>
	</servlet-mapping>

在/WEB-INF/增加一个叫servlet-name-servlet.xml配置文件。该文件的命名有一定的规则,红色servlet-name需要和web.xml中的<servlet-name>springhessian</servlet-name>定义的名称相匹配,比如本例子应叫springhessian-servlet.xml,这样简单也不容易出错。
当然该文件也可以自己任意命名。如果是自定义的文件名称不符合上述默认的规则,需要在<servlet>中增加<init-param>相关属性,人为指定加载配置文件,否则会报错。
范例:springhessian-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
	<bean id="helloHessianImpl"
		class="michael.hessian.impl.HelloHessianImpl" />
	<!-- 使用HessianServiceExporter 将bean生成Hessian服务-->
	<bean name="/helloHessianService"
		class="org.springframework.remoting.caucho.HessianServiceExporter">
		<!-- 定义需要生成服务的实现类-->
		<property name="service" ref="helloHessianImpl" />
		<!-- Hessian 提供服务的接口-->
		<property name="serviceInterface"
			value="michael.hessian.HelloHessian" />
	</bean>
</beans>


3.java客户端验证
  和上面的例子相似,只需要把访问的url替换成新的即可如下:
String url=http://localhost:8082/J2EE_sjsky/springhessian/helloHessianService

运行结果和上面例子一样。

4.spring配置客户端
  增加一个spring的bean配置文件hessian-client.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
	<bean id="helloHessianClient"
		class="org.springframework.remoting.caucho.HessianProxyFactoryBean">
		<property name="serviceUrl">
			<value>
				http://localhost:8082/J2EE_sjsky/springhessian/helloHessianService
			</value>
		</property>
		<property name="serviceInterface"
			value="michael.hessian.HelloHessian" />
	</bean>
</beans>


测试代码HessianSpringClient.java:
package michael.hessian.client;

import java.util.Map;

import michael.hessian.HelloHessian;
import michael.hessian.MyCar;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author michael
 * 
 */
public class HessianSpringClient {

    /**
     * @param args
     */
    public static void main(String[] args) {
        try {
            ApplicationContext context = new ClassPathXmlApplicationContext(
                    "hessian-client.xml");

            HelloHessian hello = (HelloHessian) context
                    .getBean("helloHessianClient");

            System.out.println(hello.sayHello());

            MyCar car = hello.getMyCar();
            System.out.println(car.toString());

            for (Map.Entry<String, String> entry : hello.myBabays().entrySet()) {
                System.out.println(entry.getKey() + "   " + entry.getValue());
            }

            for (String str : hello.myLoveFruit()) {
                System.out.println(str);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

运行结果和上面完全一致。
5.com.caucho.hessian.io.HessianProtocolException: expected string at 0x6d异常处理
我在spring+hessian整合测试过程中,客户端调用时,发生了异常,而服务端错误内容如下:
2011-4-25 16:14:44 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet remoting threw exception
com.caucho.hessian.io.HessianProtocolException: expected string at 0x6d
	at com.caucho.hessian.io.Hessian2Input.error(Hessian2Input.java:2882)
	at com.caucho.hessian.io.Hessian2Input.expect(Hessian2Input.java:2830)
	at com.caucho.hessian.io.Hessian2Input.readString(Hessian2Input.java:1362)
	at com.caucho.hessian.io.Hessian2Input.readMethod(Hessian2Input.java:272)
	at com.caucho.hessian.server.HessianSkeleton.invoke(HessianSkeleton.java:249)
	at com.caucho.hessian.server.HessianSkeleton.invoke(HessianSkeleton.java:221)
	at org.springframework.remoting.caucho.Hessian2SkeletonInvoker.invoke(Hessian2SkeletonInvoker.java:67)
	at org.springframework.remoting.caucho.HessianServiceExporter.handleRequest(HessianServiceExporter.java:147)
	at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:49)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:819)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:754)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:399)
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:364)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
	at java.lang.Thread.run(Thread.java:619)

经查资料发现原来是hessian和spring的版本不兼容引起的,重新下载hessian-3.1.6.jar导入项目,一切运行正常,测试完全通过。

-----------------------------------分 ------------------------------------隔 ------------------------------------线 --------------------------------------


4
2
分享到:
评论
2 楼 sjsky 2011-08-08  
ruijin5566 写道
very good

1 楼 ruijin5566 2011-08-08  
very good

相关推荐

    闲着没事Hessian开发WebService的总结(一)

    标题中的“闲着没事Hessian开发WebService的总结(一)”表明这是一篇关于使用Hessian框架开发Web服务的文章,作者可能在其中分享了个人的经验和理解。Hessian是一种轻量级的远程调用协议,它允许Java和.NET之间进行...

    hessian.jar 轻量级webservice实现

    hessian.jar 轻量级webservice实现 hessian.jar 轻量级webservice实现 hessian.jar 轻量级webservice实现

    基于java的Hessian实现

    基于java实现hessian进行服务器之间数据交互demo项目 实现功能: 1.基于spring 2.5.6+hessian3.1.6带有签名安全机制 2.基于servlet代理机制实现HessianServlet,进行简单IP地址校验功能!

    基于spring+hessian框架的webservice实例

    在"基于spring+hessian框架的webservice实例"中,我们将看到如何结合Spring和Hessian来创建和消费Web服务。首先,我们需要创建一个服务接口和服务实现。这个接口定义了可供远程调用的方法,而实现则提供了具体的功能...

    hessian实现远程调用

    下面我们将详细介绍Hessian的实现原理以及如何在实际开发中运用它进行远程调用。 首先,Hessian基于HTTP协议,使用二进制序列化来减少数据传输量,从而提高通信效率。它支持Java、C++等多种语言,使得跨语言的远程...

    WebService另一种轻量级实现—Hessian 学习笔记.rar

    **WebService的轻量级实现——Hessian学习笔记** 在IT行业中,WebService作为一种常见的跨平台、跨语言的通信机制,被广泛应用于系统间的交互。然而,传统的SOAP(Simple Object Access Protocol)协议实现的...

    基于WebService的Hessian例子教程

    本教程将深入讲解如何使用Hessian实现基于WebService的应用。 【描述】提供的教程包含了服务器端和客户端的实例代码,这两个例子旨在帮助开发者快速理解和应用Hessian。它们非常直观,可以直接运行,无需复杂配置,...

    Java Hessian小试(转)

    Java Hessian小试(转) Java Hessian是一种二进制的RPC(远程过程调用)协议,由Caucho公司开发。它旨在提供轻量级、高效的跨语言通信方式,尤其适合于Java与Java之间的通信,但同时也支持与其他语言如Python、C++等...

    理解RESTful架构、Hessian简介、机制、Webservice及cxf介绍

    RESTful架构是一种面向资源的设计方式,它强调在客户端...而WebService和CXF则是为了实现跨平台服务交互,其中CXF特别在支持RESTful服务方面表现出色。了解和掌握这些技术,对于开发高效、可扩展的分布式系统至关重要。

    hessian vc实现

    在VC(Visual C++)环境下实现Hessian客户端,可以让你的应用程序与使用Hessian服务端进行高效的数据交换。本文将详细介绍如何在VC中实现Hessian客户端,并提供相关知识点。 首先,理解Hessian协议的基础知识是必要...

    hessian_homework1_hessian_matlab中心线_hessianmatlab_

    本项目“hessian_homework1_hessian_matlab中心线_hessianmatlab_”是利用MATLAB实现的Hessian矩阵计算,用于寻找图像中的曲线中心线。下面将详细解释Hessian矩阵的概念、计算方法以及在MATLAB中的实现。 Hessian...

    hessian轻量级 rpc实现

    《Hessian轻量级RPC实现详解》 在分布式系统中,远程过程调用(Remote Procedure Call,简称RPC)是一种常用的技术,它使得客户端能够像调用本地方法一样调用远程服务器上的服务。Hessian,由Caucho Technology开发...

    hessian通讯的安卓实现的简单DEMO

    这个“hessian通讯的安卓实现的简单DEMO”是一个示例项目,用于展示如何在Android平台上利用Hessian进行通信。下面将详细介绍Hessian在Android中的应用以及相关知识点。 1. **Hessian协议**:Hessian由Caucho公司...

    基于python的Hessian Frangi滤波算法设计与实现

    总的来说,基于Python的Hessian Frangi滤波算法设计与实现涉及图像处理基础、Hessian矩阵、特征值分析以及阈值判断等多方面知识。通过学习和实践这一算法,不仅可以提升图像分析技能,也能为医学影像分析、计算机...

    Hessian

    Caucho Technology提供了Hessian的开源实现,开发者可以通过阅读源码了解其内部细节,如序列化和反序列化的具体实现、类型转换逻辑等。 在博客链接《iteye博客:550771》中,作者可能详细讨论了Hessian的使用方法、...

    Hessian 使用小结

    对于非X.509证书的加密,用户需要自定义类继承`HessianEnvelope`,并实现`wrap(Hessian2Output)`,`unwrap(Hessian2Input)`和`unwrapHeaders(Hessian2Input)`接口,以实现自己的加密逻辑。 **封装工具包** 虽然在...

    采用(rest ,hession,cxf)几种技术实现webservice

    解压提供的"webservice(rest_cxf_hession)"压缩包后,你将看到一个结构化的Maven项目,包含示例代码和配置文件,可以直接运行和测试这三种Web服务技术的实现。 总结来说,REST、Hessian和CXF是实现Web服务的三种...

    hessian案例,hessian案例

    Hessian是一种高效的二进制序列化协议,常用于实现轻量级的远程过程调用(RPC)。这个案例涉及到了Hessian在Java和Python之间的跨语言通信。以下是对Hessian技术及其应用的详细解释: 1. **Hessian简介**:Hessian...

    hessian

    至于【压缩包子文件的文件名称列表】中的"hessian_cilent",这可能是Hessian的客户端实现示例代码或者库文件。通常,这个文件会包含客户端如何连接到Hessian服务、创建代理以及调用远程方法的代码片段。 总结起来,...

    android实现Hessian通信源码

    在android与web端实现hessian通信,源码为android客户端源码,jar包来自http://hsrong.iteye.com/blog/1719996,google官网提供的hessdroid不可用,因为里面包含一些android不支持的类;hessian官网的jar包适用于web...

Global site tag (gtag.js) - Google Analytics