`

Hessian入门引路

阅读更多

最近在项目中接触到了Hessian,发现这是一个比较好的东西。官方地址:http://www.caucho.com/hessian/
下面是网络上的一些说明资料:
        相比WebService,Hessian更简单、快捷。采用的是二进制RPC协议(Binary),因为采用的是二进制协议,所以它很适合于发送二进制数据。Hessian通常通过Web应用来提供服务,因此非常类似于WebService。只是它不使用SOAP协议。
        Hessian通过Servlet提供远程服务。需要将匹配某个模式的请求映射到Hessian服务。Spring的DispatcherServlet可以完成该功能,DispatcherServlet可将匹配模式的请求转发到Hessian服务。Hessian的server端提供一个servlet基类, 用来处理发送的请求,而Hessian的这个远程过程调用,完全使用动态代理来实现的,,推荐采用面向接口编程,因此,Hessian服务建议通过接口暴露。
 Hessian处理过程示意图:
         客户端——>序列化写到输出流——>远程方法(服务器端)——>序列化写到输出流 ——>客户端读取输入流——>输出结果
简单来说:
        客户端拥有与服务器相同(兼容)的接口,客户端通过Hession请求就可以调用服务器的方法,客户端包括:Java,Objective C,Flex 等等

 

简单例子:

第一种配置方式(在Hession的Servlet中配置接口和现实类,服务器返回普通参数):

服务端

/**
 * 服务器给客户端的暴露的接口
 * 
 * @author ZhangMingxue
 * 
 */
public interface IHello {
	public String sayHello();
}

 

/**
 * 服务器实现有接口
 * 
 * @author ZhangMingxue
 * 
 */
public class HelloImple implements IHello {

	public String sayHello() {
		return "Hello Hession !";
	}
}

 服务端的配置:在WEB-INF/web.xml添加

<servlet>
		<servlet-name>HelloServlet</servlet-name>
		<!-- Hession提供的Servlet -->
		<servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>
		<init-param>
			<param-name>home-class</param-name>
			<!-- 服务器对接口的现实,供客户端调用 -->
			<param-value>com.mengya.imple.HelloImple</param-value>
		</init-param>
		<init-param>
			<param-name>home-api</param-name>
			<!-- 客户端接口 -->
			<param-value>com.mengya.inter.IHello</param-value>
		</init-param>
	</servlet>
	<servlet-mapping>
		<servlet-name>HelloServlet</servlet-name>
		<url-pattern>/HelloServlet</url-pattern>
	</servlet-mapping>

 客户端测试(本实例客端也是用Java):

public static void main(String[] args) {
		// 服务器访问路径
		String url = "http://127.0.0.1:8080/HessionDemos/HelloServlet";
		HessianProxyFactory hessianProxyFactory = new HessianProxyFactory();
		try {
			// IHello是客户端的接口,与服务器接口一致(客户端的语言包括:Java,Objective C,Flex 等)
			IHello iHello = (IHello) hessianProxyFactory.create(IHello.class,
					url);
			// 客户端调服务器的接口实现
			System.out.println("Result == " + iHello.sayHello());
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
	}

 以上就是一个简单的例子。服务器与客户端共用的接口是:IHello,服务器现实的接口是: HelloImple,客户端通过Hession根据客户端接口调用服务器方法并接受返回参数。经过测试,客户端与服务器端的接口不一定要一样!如下:

服务器端接口:

/**
 * 服务器给客户端的暴露的接口
 * 
 * @author ZhangMingxue
 * 
 */
public interface IHello {
	public String sayHello();

	public void clientNotMethod();
}

  客户端接口:

/**
 * 客户端与服务器相同(或兼容)的接口
 * 
 * @author ZhangMingxue
 * 
 */
public interface IHello {
	public String sayHello();
	
	public String serverNotMehtod();
}

 以上接口也可以在客户端通过IHello接口调用服务器的 sayHello()方法,不赞成这样,只是测试发现这样也可以调用。

 

第二种配置方式(继承Hession的Servlet,服务器返回Bean):

1、调用参数Bean与结果参数Bean

/**
 * 客户端与服务端传输的JavaBean,必须Serializable
 * 
 * @author ZhangMingxue
 * 
 */
public class Person implements Serializable {
	private static final long serialVersionUID = 3400062242004002707L;
	private String userId;
	private String userName;

	public String getUserId() {
		return userId;
	}

	public void setUserId(String userId) {
		this.userId = userId;
	}

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

}

 服务端接口:

/**
 * 服务端接口
 * 
 * @author mingxue.zhang@163.com
 * @company http://www.brilliance.com.cn
 * @date 2013-4-14
 * @version 1.0
 * @JDK 1.5
 */
public interface IPersonServer {

	public Person getPerson(Person bean);

}

 服务端Servlet:

/**
 * 服务端访问Servlet,继承HessianServlet并实现服务端接口
 * 
 * @author ZhangMingxue
 * 
 */
public class PersonServlet extends HessianServlet implements IPersonServer {

	private static final long serialVersionUID = -343120217079779622L;

	/**
	 * 实现服务端接口的方法
	 */
	public Person getPerson(Person bean) {
		System.out.println("客户端参数:" + bean.getUserId() + "\t"
				+ bean.getUserName());
		bean.setUserName("Server:" + bean.getUserName());
		return bean;
	}

}

 服务端的配置:在WEB-INF/web.xml添加

<servlet>
		<servlet-name>PersonServlet</servlet-name>
		<servlet-class>com.mengya.servlet.PersonServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>PersonServlet</servlet-name>
		<url-pattern>/PersonServlet</url-pattern>
	</servlet-mapping>

客户端接口 与服务端接口一致(不一定是Java语言,接口名与接口的方法一致),客户端测试如下:

public class PersonTest {
	public static void main(String[] args) {
		// 服务器访问路径
		String url = "http://127.0.0.1:8080/HessionDemos/PersonServlet";
		HessianProxyFactory hessianProxyFactory = new HessianProxyFactory();
		try {
			// IHello是客户端的接口,与服务器接口一致(客户端的语言包括:Java,Objective C,Flex 等)
			IPersonServer iPersonServer = (IPersonServer) hessianProxyFactory
					.create(IPersonServer.class, url);
			// 客户端调服务器的接口实现
			Person person = new Person();
			person.setUserId("1001");
			person.setUserName("mingxue.zhang@163.com");
			Person resultBean = iPersonServer.getPerson(person);
			System.out.println(resultBean.getUserId() + "\t"
					+ resultBean.getUserName());
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
	}
}

 

源代码见附件! 

 

后记:

        把Hession用于移动发现,客户端可以直接调用服务端的方法非常方便!

分享到:
评论
2 楼 xiaobojava 2013-04-24  
今天发现hessian(4.0.7)对java.sql.Date和java.sql.Timestamp支持不是很好,若JOPO对象中包含这个两个属性值,并且这两个属性值为空。客户端反序列化时报错,无法将NULL反序列化。
1 楼 rkikbs 2013-04-16  
写的比较详细,最好加上与spring的整合。

相关推荐

    hessian入门小例子

    这个“Hessian入门小例子”是帮助开发者理解如何在实际项目中应用Hessian的一种方式。下面我们将深入探讨Hessian协议、它的特点、以及如何在Java环境中设置和使用Hessian服务和客户端。 首先,让我们了解Hessian的...

    Hessian学习入门实例

    这是一个Hessian入门学习的实例,程序包是一个web工程,使用intellij idea + Maven开发,其中通过两个方式展示了使用Hessian实现RMI的原理,一个是访问jsp页面,一个是在代码中手工创建client。对于Hessian Servlet...

    hessian入门实例,导入就可以直接运行

    这个"**hessian入门实例**"旨在帮助初学者快速理解并应用Hessian技术,通过导入到MyEclipse这样的集成开发环境中,可以直接运行示例代码,从而直观地了解Hessian的工作原理。 首先,我们要理解什么是RPC。RPC允许一...

    Hessian入门案例源代码

    在“Hessian入门案例源代码”中,我们可以通过分析HessianDemo这个项目来学习如何使用Hessian。源代码通常包括服务器端和客户端两部分,它们展示了如何定义服务接口、实现服务、发布服务以及如何调用这些服务。 1. ...

    Hessian 入门介绍

    **Hessian入门介绍** 在IT领域,Hessian是一种二进制Web服务协议,它由Caucho Technology开发,主要用于提供轻量级、高效的远程过程调用(RPC)机制。Hessian的目标是简化分布式系统间的通信,减少网络传输的数据量...

    hessian入门案例

    Hessian是一种二进制Web服务协议,它提供了一种轻量级、高效的远程方法调用(RPC)方式。Hessian的出现旨在解决XML-RPC在数据传输时的效率问题,因为XML格式的数据在网络上传输时体积较大,解析速度较慢。下面我们将...

    轻量级远程服务调用Hessian的入门实例和与Spring整合的实例.zip

    一、Hessian入门实例 Hessian的入门实例主要展示了如何创建一个简单的服务提供者和消费者。首先,我们需要定义一个服务接口,例如`HelloService`,包含一个或多个方法,这些方法将被远程调用。然后,我们需要实现这...

    Hessian Binary Web Service Protocol远程接口调用入门Demo

    本教程将通过一个入门Demo来介绍如何使用Hessian进行远程接口调用。 首先,让我们理解Hessian的优势。与XML-RPC相比,Hessian使用二进制编码,因此在网络传输时占用的带宽更少,解析速度更快。此外,Hessian支持...

    Hessian

    **Hessian:深入理解与应用** Hessian是一种二进制Web服务协议,它由Caucho Technology公司开发,主要用于提供轻量级、高效的远程方法调用(Remote Method Invocation,RMI)服务。Hessian的目标是简化分布式系统...

    hessian案例,hessian案例

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

    Hessian多个版本打包下载

    这个压缩包包含了Hessian的多个版本,分别是Hessian3.1.6、Hessian3.2.1以及Hessian4.0.7。每个版本都有其特定的功能改进和优化,了解这些版本的区别和适用场景对于开发者来说至关重要。 Hessian3.1.6是Hessian的一...

    hessian

    Hessian是一种二进制Web服务协议,由Caucho Technology公司开发,主要用于提供轻量级、高效的远程方法调用(Remote Method Invocation, RMI)机制。它结合了HTTP协议的可扩展性和Java序列化机制的易用性,使得在...

    多尺度hessian滤波器图像增强

    在图像处理领域,多尺度Hessian滤波器是一种高级的图像增强技术,它主要用于检测图像中的线性结构,特别是对于微弱或者噪声较大的图像特征有很好的识别能力。这个技术是基于数学形态学的Hessian矩阵理论,由V.S. ...

    基于Hessian矩阵增强的心血管分割_hessian_hessian血管_hessian血管分割_血管分割_Hessian矩阵

    在IT领域,尤其是在医学图像分析中,Hessian矩阵是一个重要的数学工具,用于图像特征检测,特别是在血管分割的应用中。本文将深入探讨标题和描述中提到的"基于Hessian矩阵增强的心血管分割"这一主题。 Hessian矩阵...

    Hessian应用

    《Hessian应用详解》 Hessian,一种轻量级的二进制协议,因其高效、简单的特点,在分布式服务中被广泛应用。它允许开发者在HTTP上透明地调用远程方法,就像是本地方法调用一样,极大地提高了开发效率和系统性能。...

    dubbo-hessian协议http请求demo(java)

    - 在实际开发中,我们可能会需要编写一些辅助工具类来处理Hessian的相关操作,例如Hessian2Input和Hessian2Output,它们用于读写Hessian序列化的二进制流。 6. **安全性与优化**: - 虽然Hessian协议效率高,但其...

    hessianServer

    在IT行业中,Hessian是一种基于二进制协议的RPC(远程过程调用)框架,它使得客户端和服务端之间能够高效地进行数据交换。HessianServer指的是实现Hessian协议的服务端程序,通常用于构建分布式系统,使得不同的应用...

    Spring中集成Hessian的问题

    在Spring框架中集成Hessian是为了实现远程方法调用(Remote Method Invocation, RMI),这是一种轻量级的序列化协议,可以高效地传输Java对象。Hessian使得服务提供者和服务消费者之间能够通过网络进行快速的数据...

    Hessian的Spring配置

    在Spring框架中,Hessian是一种轻量级的远程方法调用(RPC)协议,它能够实现Java对象到字节流的序列化,从而使得服务端的对象可以在客户端直接调用,仿佛对象就在本地一样。Hessian提供了高效的二进制RPC协议,使得...

Global site tag (gtag.js) - Google Analytics