- 浏览: 905084 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (263)
- J2EE (9)
- Spring (11)
- Hibernate (11)
- Struts (5)
- opensource (19)
- Hadoop (28)
- 架构设计 (8)
- 企业应用 (10)
- SNMP (8)
- SSO (4)
- webservice (11)
- RPC (2)
- 编程语言 (0)
- Java (30)
- Javascript (5)
- NoSQL (11)
- 数据库 (0)
- oracle (8)
- MySQL (3)
- web (1)
- Android (2)
- Linux (15)
- 软件工具 (15)
- 项目构建 (11)
- 测试工具 (2)
- Exception (19)
- 杂谈 (4)
- Groovy (5)
- Nodejs (1)
- MacOSX (4)
最新评论
-
fighhin:
decode(BinaryBitmap,java.util.M ...
条形码/二维码之开源利器ZXing图文介绍 -
u013489005:
追问:楼主,请问有中文文档么?我的邮箱是frankgray@s ...
Java表达式计算引擎:Expr4J -
u013489005:
感谢博主 需要引入的包是import java.io.*;im ...
Java表达式计算引擎:Expr4J -
calosteward:
感谢楼主分享。。 Zxing 我听说过的。__________ ...
条形码/二维码之开源利器ZXing图文介绍 -
u013810758:
judasqiqi 写道感谢楼主!想请问楼主一下这个生成的图片 ...
Java实现二维码QRCode的编码和解码
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:
在开始之前当然需要到官网上下载相关的lib包,放入项目的/WEB-INF/lib/下
【一】、纯Hessian实现步骤:
1.基本代码
首先编写一个服务的接口类:HelloHessian.java
一个java bean文件MyCar.java:
服务端接口的实现类:HelloHessianImpl.java
2.配置文件web.xml修改
在web.xml配置文件里增加如下信息:
3.java客户端验证
运行结果如下:
【二】、spring+hessian 实现服务端:
1.基本代码见上面的demo
2.修改配置文件
在web.xml,增加内容如下:
在/WEB-INF/增加一个叫servlet-name-servlet.xml配置文件。该文件的命名有一定的规则,红色servlet-name需要和web.xml中的<servlet-name>springhessian</servlet-name>定义的名称相匹配,比如本例子应叫springhessian-servlet.xml,这样简单也不容易出错。
当然该文件也可以自己任意命名。如果是自定义的文件名称不符合上述默认的规则,需要在<servlet>中增加<init-param>相关属性,人为指定加载配置文件,否则会报错。
范例:springhessian-servlet.xml
3.java客户端验证
和上面的例子相似,只需要把访问的url替换成新的即可如下:
运行结果和上面例子一样。
4.spring配置客户端
增加一个spring的bean配置文件hessian-client.xml
测试代码HessianSpringClient.java:
运行结果和上面完全一致。
5.com.caucho.hessian.io.HessianProtocolException: expected string at 0x6d异常处理
我在spring+hessian整合测试过程中,客户端调用时,发生了异常,而服务端错误内容如下:
经查资料发现原来是hessian和spring的版本不兼容引起的,重新下载hessian-3.1.6.jar导入项目,一切运行正常,测试完全通过。
-----------------------------------分 ------------------------------------隔 ------------------------------------线 --------------------------------------
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导入项目,一切运行正常,测试完全通过。
-----------------------------------分 ------------------------------------隔 ------------------------------------线 --------------------------------------
发表评论
-
JAX-WS开发的webservice如何在Tomcat下发布
2012-08-07 10:01 1711目录: 构建项目 服务端编码 sun ... -
webservice获取客户端IP地址
2012-08-07 09:28 1453目录: 基于JDK6 jax-ws开发的webser ... -
XFire基于JSR181注释实现webservice的示例
2012-08-01 10:13 997目录 构建项目 服务端实现 客户端测 ... -
运用XFire的嵌入式HTTP服务器发布服务
2012-07-31 09:15 868目录 构建项目 创建服务端API 嵌 ... -
XFire开发客户端几种方式的示例
2012-07-31 09:14 1191目录: 概述 根据默认配置实现代理客户端 ... -
XFire webservice入门开发实例
2012-07-27 14:59 1052目录: 前言概述 环境配置 构建项目 ... -
JAX-WS开发webservice示例详解
2012-07-12 12:55 1652目录: 概述 实验环境 服务端的实现 ... -
Axis开发webservice的简单实例
2010-06-04 12:32 3851blog迁移至:http://www.micmiu.c ... -
JDK6 webservice的应用(注意SOAPBinding.Style不同的差异)
2010-04-20 11:45 5460blog迁移至:http://www ... -
xfire webservices图文介绍详细步骤(附源码)
2010-03-23 01:56 1589blog迁移至:http://www.micmiu.c ...
相关推荐
NULL 博文链接:https://topmanopensource.iteye.com/blog/836038
hessian.jar 轻量级webservice实现 hessian.jar 轻量级webservice实现 hessian.jar 轻量级webservice实现
基于java实现hessian进行服务器之间数据交互demo项目 实现功能: 1.基于spring 2.5.6+hessian3.1.6带有签名安全机制 2.基于servlet代理机制实现HessianServlet,进行简单IP地址校验功能!
webservice技术,基于spring+hessian框架开发的简单实例
在开发过程中,有时需公用某个工程的接口,需要用到hessian实现远程调用
RESTful架构: (1)每一个URI代表一种资源; (2)客户端和服务器之间,传递这种资源的某种...是一种标准,不同的平台,不同的语言都可提供webservice开发实现。在java领域,webservice框架很多,axis,xfire,cxf
hessian轻量级 rpc实现
matlab 图像处理实现hessian寻找曲线中心线上点
WebService另一种轻量级实现—Hessian 学习笔记.rar
基于WebService的Hessian例子,有代码,可以直接跑起来,一针见血的例子,相当 简单,有服务器端与客户端两个例子,相当好理解
hessian客户端的vc使用
google官网提供的hessdroid不可用,里面包含一些android不支持的类;hessian官网的jar包适用于web端,不适用于android端开发,改包所做的修改仅仅是删除一些android不支持的类
NULL 博文链接:https://zhuchengzzcc.iteye.com/blog/1534311
demo中实现了hessian的通讯,支持安卓的hessian的jar,实际项目中已经使用。
在android与web端实现hessian通信,源码为android客户端源码,jar包来自http://hsrong.iteye.com/blog/1719996,google官网提供的hessdroid不可用,因为里面包含一些android不支持的类;hessian官网的jar包适用于web...
Hessian一般是通过Web应用来提供服务,因此非常类似于平时我们用的 WebService。只是它不使用SOAP协议,但相比webservice而言更简单、快捷。这个文件可以是hessian在spring项目和web项目的简单配置
rest cxf hessian 3种webservice的例子 用了maven搭建 项目写了CXF的rest和soap两种方式 client采用多种方式实现。
基于加密技术的Hessian 远程调用的研究与实现
基于python的Hessian Frangi滤波算法设计与实现
轻量级WebService,打包了轻量级WebService hessian的一个简单demo,还有Xfire的一个简单demo,还有一些PPT文档,相对来说,对于没有入门的童鞋们来说是个不错的资源,免费共享给大家,互相共勉(我也是菜鸟)。