注:
如果调用到download方法的时候,出现 java.io.IOException: stream is closed
则此时应该是jar包的问题,貌似这是hessian的一个bug : 关于该bug
解决方法下载hessian.jar的源码包,修改 com.caucho.hessian.client.HessianProxy :
在 Object value = in.readReply(method.getReturnType()); 这一句话之后加上下面代码:
- if (value instanceof InputStream) {
- value = new ResultInputStream(conn, is, in, (InputStream) value);
- is = null;
- conn = null;
- }
然后重新打包,使用这个新的jar包就没问题了。。。
然后,就可以看到sayHello、下载、上传成功的结果了。。。
最后提供一个我自己修改过之后的hessian.jar
转自百度百科:http://baike.baidu.com/view/2255290.htm
Hessian是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能. 相比WebService,Hessian更简单、快捷。采用的是二进制RPC协议,因为采用的是二进制协议,所以它很适合于发送二进制数据
在进行基于Hessian的项目开发时,应当注意以下几点:
▲JAVA服务器端必须具备以下几点:
·包含Hessian的jar包
·设计一个接口,用来给客户端调用
·实现该接口的功能
·配置web.xml,配好相应的servlet
·对象必须实现Serializable 接口
·对于复杂对象可以使用Map的方法传递
▲客户端必须具备以下几点:
·java客户端包含Hessian.jar的包。C#中引用hessianCSharp.dll
·具有和服务器端结构一样的接口。包括命名空间都最好一样
·利用HessianProxyFactory调用远程接口。
简单JAVA客户端例子:
服务器端
新建一个名EasyHession的webProject项目,将Hessian.jar放入web-inf下的lib中
创建接口:
package com.tch.test.hessian; import java.io.InputStream; public interface BasicAPI { public void setGreeting(String greeting); public String hello(); public User getUser(); /** * Created on: 2013-12-11 * <p>Discription: 下载数据</p> * @return InputStream */ public InputStream download(String path) throws Exception; }
实现接口:
package com.tch.test.hessian; import java.io.FileInputStream; import java.io.InputStream; public class BasicService implements BasicAPI { private String _greeting = "Hello, world"; public void setGreeting(String greeting) { _greeting = greeting; System.out.println("set greeting success:" + _greeting); } public String hello() { return _greeting; } public User getUser() { return new User("prance", "meshow"); } public InputStream download(String path) throws Exception{ System.out.println(path+"******************************"); InputStream inputStream = new FileInputStream(path); return inputStream; } }
创建一个实现Serializable的projo类也可以是Bean。
package com.tch.test.hessian; import java.io.Serializable; public class User implements Serializable { private static final long serialVersionUID = 1L; String userName = "snoopy"; String password = "showme"; public User(String user, String pwd) { this.userName = user; this.password = pwd; } public String getUserName() { return userName; } public String getPassword() { return password; } }
接下来是配置web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <servlet> <servlet-name>hello</servlet-name> <servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class> <init-param> <param-name>service-class</param-name> <param-value>com.tch.test.hessian.BasicService</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
将一切配置成功后,将项目发布到web 服务器上去,可以是Tomcat,Rain等等。
java客户端
创建一个名为HessianClient的JAVAProject,载入hessian.jar包
创建与服务器端一样的接口,及基础类
package hessian;
package com.tch.test.hessian; import java.io.InputStream; public interface BasicAPI { public void setGreeting(String greeting); public String hello(); public User getUser(); /** * Created on: 2013-12-11 * <p>Discription: 下载数据</p> * @return InputStream */ public InputStream download(String path) throws Exception; }
package com.tch.test.hessian; import java.io.Serializable; public class User implements Serializable { private static final long serialVersionUID = 1L; String userName = "snoopy"; String password = "showme"; public User(String user, String pwd) { this.userName = user; this.password = pwd; } public String getUserName() { return userName; } public String getPassword() { return password; } }
创建客户端程序
package com.tch.test.hessian; import java.io.InputStream; import com.caucho.hessian.client.HessianProxyFactory; public class BasicClient { public static void main(String[] args) throws Exception { String url = "http://127.0.0.1:8080/dubboprovider/hello"; HessianProxyFactory factory = new HessianProxyFactory(); BasicAPI basic = (BasicAPI) factory.create(BasicAPI.class, url); System.out.println("Hello:" + basic.hello()); System.out.println("Hello:" + basic.getUser().getUserName()); System.out.println("Hello:" + basic.getUser().getPassword()); basic.setGreeting("HelloGreeting"); System.out.println("Hello:" + basic.hello()); InputStream inputStream = basic.download("D:\\MyBackup\\我的文档\\Downloads\\a.txt"); // 执行远程方法 byte b[] = new byte[1024]; int n; try { while ((n = inputStream.read(b)) != -1) { System.out.print(new String(b,0,n,"utf-8")); } } catch (Exception e) { e.printStackTrace(); }finally{ inputStream.close(); } } }
就可以看到结果信息了。。。就如同本地调用一样
相关推荐
本文将深入探讨Hessian框架的基础知识,它是一个高效的二进制序列化协议,广泛应用于Java和.NET之间跨语言通信。通过学习Hessian,我们可以更有效地处理数据传输,提高应用性能。 首先,让我们理解什么是序列化。...
这是一个Hessian入门学习的实例,程序包是一个web工程,使用intellij idea + Maven开发,其中通过两个方式展示了使用Hessian实现RMI的原理,一个是访问jsp页面,一个是在代码中手工创建client。对于Hessian Servlet...
Hessian是一种轻量级的...通过这个例子,开发者可以学习如何在Java项目中集成Hessian,提升服务间的通信效率,同时减少网络开销。在实际应用中,可以根据项目需求扩展服务端的功能,并编写更多的客户端来消费这些服务。
在博客链接《iteye博客:550771》中,作者可能详细讨论了Hessian的使用方法、优缺点以及实战案例,可以作为学习Hessian的参考资料。 **六、Hessian的使用场景** 1. **微服务通信**:在微服务架构中,Hessian可以...
总结,这个压缩包文件提供了一个完整的Hessian学习路径,包括基础的Hessian服务创建和更高级的与Spring框架的整合。通过实践这些实例,开发者能够快速掌握Hessian的核心概念,进而将其应用于实际项目中,提升远程...
**Hessian入门介绍** 在IT领域,Hessian是一种二进制Web服务协议,它由Caucho Technology开发,主要用于提供轻量级、高效的远程过程调用(RPC)机制。Hessian的目标是简化分布式系统间的通信,减少网络传输的数据量...
在“Hessian入门案例源代码”中,我们可以通过分析HessianDemo这个项目来学习如何使用Hessian。源代码通常包括服务器端和客户端两部分,它们展示了如何定义服务接口、实现服务、发布服务以及如何调用这些服务。 1. ...
它使用依赖注入(DI)和面向切面编程(AOP)来简化应用开发,使得开发者可以专注于业务逻辑而不是底层基础设施。在 SpringMVC 中,Controller 是核心组件,负责处理客户端的请求,并将结果返回给客户端。 接下来是 ...
要学习和使用Hessian,首先你需要了解Java基础和HTTP协议。然后,你可以通过下载提供的`Hessian`和`HessianClient`示例,研究其源代码,理解如何设置服务端和客户端,以及它们如何通过Hessian协议进行通信。此外,...
在本实例中,你将学习如何在服务端配置和发布Hessian服务,以及在客户端如何创建Hessian代理并调用远程方法。 在实际项目中,Hessian常用于内部系统间的通信,比如微服务架构中的服务间调用。由于其高效的特性,它...
Hessian矩阵基础理论 Hessian在优化算法中的应用 Hessian与二阶导数的关系 Hessian矩阵的计算方法 Hessian矩阵的数值稳定性 Hessian在机器学习中的角色 Hessian矩阵的特征值分析 Hessian矩阵的秩与正定性 Hessian在...
本教程将引导你入门Hessian,通过一个简单的JAVA demo来理解其工作原理和应用。 首先,我们需要了解Hessian的基本概念。Hessian是由Caucho Technology开发的一种二进制Web服务协议,它提供了对Java对象序列化和反...
在图像处理领域,Hessian Frangi滤波算法是一种用于血管检测和结构分析的高级技术,尤其在医学成像中...通过学习和实践这一算法,不仅可以提升图像分析技能,也能为医学影像分析、计算机视觉等领域的工作打下坚实基础。
源代码还便于学习和研究Hessian如何处理数据编码、解码,以及如何优化网络通信性能。 Hessian的主要特点包括: 1. **二进制格式**:Hessian使用高效的二进制格式,而不是文本格式如XML或JSON,这减少了在网络上传输...
Hessian是一种二进制协议,它允许在不同的编程语言之间进行高效的远程方法调用(RPC)。...通过分析和实践这些示例代码,你可以更好地掌握Hessian的工作原理和使用方式,为你的跨语言项目打下坚实的基础。
雅各比矩阵和Hessian矩阵是深度学习和数值计算中十分重要的概念。雅各比矩阵可以看作是多元函数微分的推广,它描述了多元函数在某点的局部线性逼近。Hessian矩阵则是雅各比矩阵的推广,它包含了多元函数的二阶偏导数...
本篇文章将带你入门Hessian,了解其基本概念、工作原理以及如何在实际项目中应用。 首先,我们来理解一下Hessian的核心概念。Hessian是基于HTTP的,它使用一种高效的二进制格式来序列化和反序列化Java对象,这样就...
其中,梯度下降法是最基础也最常用的优化算法之一,但其在某些特定场景下面临局限性。为此,引入了更为高级的优化方法——牛顿法,它通过利用Hessian矩阵的信息来改进搜索方向,从而提高优化过程的效率。本文将深入...
struts2+ibatis+spring+Hessian 整合项目 web项目整合,服务端用hessian协议远程调用服务端的方法,hessian是用spring代理整合,struts2+ibatis+spring的整合项目,用作学习和开发基础平台构建很有用处,工程导入...
6. **PPT材料**:二进制Web服务Hessian.ppt很可能是讲座的幻灯片,其中可能涵盖了Hessian的基础概念、工作流程、优缺点以及实战案例等内容,是学习和复习Hessian的重要参考资料。 7. **压缩包资源**:Hessian.rar...