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

Java Hessian小试(转)

    博客分类:
  • RPC
阅读更多

      相比WebService,Hessian更简单、快捷。采用的是二进制RPC协议(Binary),因为采用的是二进制协议,所以它很适合于发送二进制数据。Hessian通常通过Web应用来提供服务,因此非常类似于WebService。只是它不使用SOAP协议。 
      Hessian通过Servlet提供远程服务。需要将匹配某个模式的请求映射到Hessian服务。Spring的DispatcherServlet可以完成该功能,DispatcherServlet可将匹配模式的请求转发到Hessian服务。Hessian的server端提供一个servlet基类, 用来处理发送的请求,而Hessian的这个远程过程调用,完全使用动态代理来实现的,,推荐采用面向接口编程,因此,Hessian服务建议通过接口暴露。

 

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

环境搭建
Hessian的下载和安装请按如下步骤进行:
(1)登http://www.caucho.com/hessian/下载Hessian。
(2)把Hessian相应的Jar包放到Web应用下,所有的jar文件都应该放在WEB-INF/lib下,该文件也不例外。

 

 

两种方式
1.纯Hessian
这种方式主要是适用于工程中没有适用像spring框架的情况下,好处是配置方便,但是当内容多的情况下,配置的内容很多。

 

 

package test;

import java.util.List;

/**
 * @author zhuc
 * @version 2012-5-17 下午9:15:50
 */
public interface IService {
	/**
	 * @param name
	 * @return
	 */
	public String sayHello(String name);
	
	/**
	 * @return
	 */
	public Car getMyCar();
	
	/**
	 * @return
	 */
	public List<String> getList();
}


package test;

import java.util.ArrayList;
import java.util.List;

import com.caucho.hessian.server.HessianServlet;

/**
 * @author zhuc
 * @version 2012-5-17 下午9:16:35
 */
public class ServiceImpl extends HessianServlet implements IService {

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

	@Override
	public String sayHello(String name) {
		return "hello: " + name;
	}

	@Override
	public Car getMyCar() {
		Car c = new Car();
		c.setName("哈哈车");
		return c;
	}

	@Override
	public List<String> getList() {
		List<String> list = new ArrayList<String>();
		list.add("haha");
		list.add("hehe");
		return list;
	}

}


package test;

import java.io.Serializable;

/**
 * @author zhuc
 * @version 2012-5-17 下午10:29:18
 */
public class Car implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = -1115598660168001267L;

	private String name;

	/**
	 * @return the name
	 */
	public String getName() {
		return name;
	}

	/**
	 * @param name the name to set
	 */
	public void setName(String name) {
		this.name = name;
	}

	/**
	 * @return the serialversionuid
	 */
	public static long getSerialversionuid() {
		return serialVersionUID;
	}
	
	
}

 

 

web.xml的详细配置

<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>test.ServiceImpl</param-value>
		</init-param>
		<init-param>
			<param-name>home-api</param-name>
			<param-value>test.IService</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>

	<servlet-mapping>
		<servlet-name>Hello</servlet-name>
		<url-pattern>/Hello</url-pattern>
	</servlet-mapping>

 

客户端远程调用服务器端提供的接口,利用的就是Hessian的HessianProxyFactory,来实现远程代理

 

package test;

import java.net.MalformedURLException;
import java.util.List;

import com.caucho.hessian.client.HessianProxyFactory;

/**
 * @author zhuc
 * @version 2012-5-17 下午9:31:14
 */
public class ClientTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		String url = "http://localhost:8080/Hessian/Hello";
		HessianProxyFactory factory = new HessianProxyFactory();
		try {
			IService hello = (IService) factory.create(IService.class, url);
			System.out.println(hello.sayHello("zhuc-no"));

			Car c = hello.getMyCar();
			System.out.println(c.getName());

			List<String> list = hello.getList();
			for (String string : list) {
				System.out.println(string);
			}
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}

	}

}
 

 

输出结果,成功

hello: zhuc-no
 哈哈车
 haha
 hehe

 

 

2.Hessian与Spring整合
相比上一种方式,这个方式就有点麻烦了。Hessian通过Servlet提供远程服务。需要将匹配某个模式的请求映射到Hessian服务。Spring的DispatcherServlet可以完成该功能,DispatcherServlet可将匹配模式的请求转发到Hessian服务,web.xml只是定义了“请求转发器”,该转发器将匹配/remoting/*的请求截获,转发给context的bean处理。而HessianServiceExporter提供bean服务。
所以Hessian与Spring整合主要就是一下两个工作:
1:通过DispatcherServlet来拦截URL请求。
2:HessianServiceExporter提供bean服务,Spring使用HessianServiceExporter,将一个常规bean导出成Hessian服务。 

 

修改web.xml的详细配置 

 

<servlet>
		<servlet-name>remoting</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<!--   
        <init-param>  
            <param-name>contextConfigLocation</param-name>  
            <param-value>/WEB-INF/remoting-servlet.xml</param-value>  
        </init-param>  
        
       	 在/WEB-INF/增加一个叫servlet-name-servlet.xml配置文件。该文件的命名有一定的规则,
       	 红色servlet-name需要和web.xml中的<servlet-name>springhessian</servlet-name>定义的名称相匹配,
       	 比如本例子应叫remoting-servlet.xml,这样简单也不容易出错。
       	 
		当然该文件也可以自己任意命名。如果是自定义的文件名称不符合上述默认的规则,
		需要在<servlet>中增加<init-param>相关属性,人为指定加载配置文件,否则会报错
         --> 
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>remoting</servlet-name>
		<url-pattern>/remoting/*</url-pattern>
	</servlet-mapping>

 

 

配置remoting-servlet.xml文件,将其放于/WEB-INF/下

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

	<!-- 定义普通bean实例 -->
	<bean id="serviceImpl" class="test.ServiceImpl" />

	<!-- 使用HessianServiceExporter 将普通bean导出成Hessian服务 -->
	<bean name="/hessianCommentService"
		class="org.springframework.remoting.caucho.HessianServiceExporter">
		<!-- 需要导出的目标bean -->
		<property name="service" ref="serviceImpl" />
		<!-- Hessian服务的接口 -->
		<property name="serviceInterface" value="test.IService" />
	</bean>
</beans>

 

客户端定义一个remoting-client.xml文件

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

	<bean id="myServiceClient"
		class="org.springframework.remoting.caucho.HessianProxyFactoryBean">
		<property name="serviceUrl">
			<value>http://localhost:8080/Hessian/remoting/hessianCommentService</value>
		</property>
		<property name="serviceInterface">
			<value>test.IService</value>
		</property>
	</bean>

</beans>

 

 

客户端调用

 

 

package spring;

import java.util.List;

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

import test.Car;
import test.IService;

/**
 * @author zhuc
 * @version 2012-5-17 下午9:59:31
 */
public class ClientTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		ApplicationContext context = new ClassPathXmlApplicationContext(
				"spring/remoting-client.xml");
		IService hello = (IService) context.getBean("myServiceClient");
		System.out.println(hello.sayHello("zhuc-spring"));

		Car c = hello.getMyCar();
		System.out.println(c.getName());

		List<String> list = hello.getList();
		for (String string : list) {
			System.out.println(string);
		}
	}

}

 

 

输出结果同上。

 

注:上述spring方式,客户端中的请求URL

http://localhost:8080/Hessian/remoting/hessianCommentService 中的hessianCommentService需要和remoting-servlet.xml配置中HessianServiceExporter的bean name相同,否则将会找不到server端

分享到:
评论
1 楼 zyslovely 2014-02-20  
http://localhost:8080/Hessian/remoting/hessianCommentService

这里写错了,应该是
http://localhost:8080/remoting/hessianCommentService</value>

相关推荐

    基于java的Hessian实现

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

    java+hessian 远程调用

    Java Hessian远程调用是一种高效的、轻量级的RPC(Remote Procedure Call)解决方案,它允许Java应用程序通过网络进行跨语言的通信。Hessian是BEA Systems开发的一种二进制Web服务协议,它提供了序列化和远程方法...

    Hessian加密传输

    1. **数据序列化**:将Java对象转换为Hessian二进制格式,使得数据可以在网络上传输。 2. **加密处理**:使用特定的加密算法(如AES、DES等)对序列化后的Hessian数据进行加密,确保数据在传输过程中的安全性。 3. *...

    hessian使用小例子

    在Java环境中,Hessian被广泛用于构建高效的分布式系统。 首先,我们来理解一下Hessian的工作原理。Hessian基于HTTP协议,它将Java对象转换为二进制流进行传输,减少了网络传输的数据量,同时也提高了序列化和反...

    hessian php与java通讯demo源码

    - Java客户端会通过Hessian库与服务器端建立连接,调用服务端暴露的方法。 - 客户端代码需要知道服务器的URL以及要调用的服务接口。Hessian库会自动处理序列化和反序列化,使得客户端可以像调用本地方法一样调用...

    java调用hessianphp写得web service

    "hessian-3_2-snap.jar"就是这个库的文件,它包含了Hessian的Java实现。将其添加到项目的类路径中后,我们就可以开始编写代码了。 在"Example.java"中,定义了Web服务的接口,例如: ```java public interface ...

    hessian实现远程调用

    Hessian是Apache项目下的一个轻量级的RPC(Remote Procedure Call,远程过程调用)框架,它提供了一种高效的二进制协议,用于在网络之间传递Java对象。下面我们将详细介绍Hessian的实现原理以及如何在实际开发中运用...

    Hessian应用

    - **二进制序列化**:Hessian的二进制序列化机制将Java对象转换为紧凑的二进制形式,这种方式不仅比XML等文本格式更节省空间,而且提高了序列化的速度。 - **远程调用模型**:Hessian提供了客户端和服务端两部分组件...

    java 使用hessian进行两台服务器资源之间同步实例

    Java 使用Hessian进行两台服务器资源之间同步是一个常见的分布式服务通信技术应用。Hessian是由Caucho公司开发的一种高效的二进制RPC(远程过程调用)协议,它能够使Java对象像本地方法一样在不同的服务器之间进行...

    hessian小例(java)

    在这个“hessian小例(java)”中,我们将深入探讨如何在Java Web项目中使用Hessian进行服务端和客户端的交互。 首先,我们要理解Hessian的工作原理。Hessian基于HTTP协议,能够将Java对象序列化为二进制流,从而在...

    hessian运用

    附件中的demo主要包括两部分hessianServer、hessianClient(没有用maven,很普通的java web运用),其中hessianServer没有用spring、hessianClient用了spring,server与client两者都同时作为了服务端与客户端,不...

    flex-hessian-java实例.rar

    Flex-Hessian-Java实例是一个关于使用Flex客户端与Java服务器之间进行高效远程调用的实践案例。这个压缩包包含了实现这一技术所需的关键组件和文件。Flex是Adobe开发的一种开放源码的富互联网应用(RIA)开发框架,...

    hessian java +c# 数据测试

    在IT行业中,跨平台通信是常见的需求,而Hessian作为一种二进制协议,因其轻量级、高效的特点,被广泛用于Java和C#等不同语言之间的远程调用(RPC)和数据交换。本文将深入探讨Hessian在Java服务端与C#客户端之间的...

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

    Hessian是Apache的一个子项目,它是一种二进制的Remoting协议,常用于Java和.NET之间进行远程方法调用(RPC)。本示例将介绍如何在Java中利用Dubbo的Hessian协议进行HTTP请求的实现。 首先,我们需要理解Hessian...

    hessian案例,hessian案例

    2. **Java中的Hessian**:在Java中,Caucho提供了Hessian库,可以方便地在服务器和客户端之间建立Hessian服务。通过简单的API,开发者可以轻松地创建服务端接口并暴露为Hessian服务,同时在客户端通过...

    HessianCSharp_Test.rar_Hessian java

    标题中的“HessianCSharp_Test.rar_Hessian java”暗示了这是一个关于使用C#(.Net)通过Hessian协议与Java进行交互的示例或测试项目。Hessian是一种二进制的Remoting协议,旨在提高远程过程调用(RPC)的效率,它...

    Hessian

    2. **简单类型支持**:Hessian支持基本的Java数据类型,如整型、浮点型、字符串、日期等,并且可以序列化和反序列化复杂对象。 3. **流式传输**:Hessian协议允许数据分块传输,这意味着服务端可以立即响应部分结果...

    Java和c#使用hessian通信

    一个简单的例子学习hessian服务:服务端为Java,客户端为C#。  先要准备好C#和Java的第三方类库:http://hessian.caucho.com/  Hssiancharp.dll  hessian-4.0.37.jar  Hessian服务端(java)  打开eclipse...

Global site tag (gtag.js) - Google Analytics