首先需要导入对应jar包
hessian-4.0.7.jar
spring 对应的jar包
1:服务器端实现
a: 作为服务器端,要有接受请求的类
package www.hessian;
import java.lang.reflect.Method;
import javax.servlet.http.HttpServletRequest;
import com.www.services.server.ServiceContext;
import com.www.framework.support.SpringHandler;
/***
* 功能:Hessian服务服务器端实现方式
* @author jinp
*/
public class HessianServlet extends com.caucho.hessian.server.HessianServlet {
/**
* 序列化
*/
private static final long serialVersionUID = -8846684123470577456L;
/**
* 通过className 和 method 要能找到具体那个类的那个方法.
* className为类名,参考本类 getClass()方法实现方式
* method为方法名。
* params为调用方法的函数(不定参数)。
*/
public Object service(String className, String method, Object... params) {
// 通过 Hessian 的方式获取 HttpServletRequest
HttpServletRequest req = (HttpServletRequest) ServiceContext.getContextRequest();
// 获取当前IP地址
String ipFrom = req.getRemoteAddr();
System.out.println("hessian:"+ipFrom);
// ip地址过滤 可以忽略
// if(UserControlUtil.isAllowedHessianIp(ipFrom)){
try {
Class c = getClass(className);
Method m = null;
if (params == null || params.length < 1) {
m = c.getMethod(method, null);
} else {
Class[] paramClass = new Class[params.length];
int i = 0;
for (final Object obj : params) {
paramClass[i++] = obj.getClass();
}
m = c.getMethod(method, paramClass);
}
return m.invoke(SpringHandler.getBean(className), params);
} catch (Exception e) {
e.printStackTrace();
}
// }
return null;
}
/***
* 通过类名获取当前的class类
* 1:className可以为实现类的第一个字母的小写(该方式为在spring中获取的方式,因为已经加载到spring中)
* 实现方式:Class c = SpringHandler.getBean(className).getClass();
* @param className
* @return 指定类对象
*/
private final Class getClass(String className) {
Class c = SpringHandler.getBean(className).getClass();
return c;
}
/***
* 通过类名获取当前的class类
* 2:className也可以为类的全路径+类名,改方式通用
* 实现方式:Class c = Class.forName(className)
* @param className
* @return 指定类对象
*/
private final Class getClass(String className) {
Class c = null;
try {
c = Class.forName(className);
} catch (ClassNotFoundException e) {
try {
c = Class.forName(className);
} catch (ClassNotFoundException e1) {
}
}
return c;
}
}
web.xml配置:
<servlet>
<servlet-name>HessianServlet</servlet-name>
<servlet-class>www.hessian.MMBHessianServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HessianServlet</servlet-name>
<url-pattern>/enter/rpc/hes.jsp</url-pattern>
</servlet-mapping>
package www.hessian.ware;
/***
* 服务器端业务逻辑实现
* @author Administrator
*
*/
public class OrderService {
/***
* 服务器端业务逻辑实现
*
注意:参数必须是封装类型 比如 int此处必须定义为Integer封装类型
* @param i
* @return
*/
public int getCount(Integer i){
// 相关处理
i=i+10 ;
return i ;
}
}
2:客户端实现
package www.hessian;
/***
* Hessian客户端 实现接口
* @author Administrator
*
*/
public interface HessianService {
public Object service(String className, String method, Object... params);
}
Hessian客户端 实现类:
package www.hessian;
import java.net.MalformedURLException;
import com.caucho.hessian.client.HessianProxyFactory;
/***
* Hessian客户端 实现类
* @author Administrator
*
*/
public class ServiceClient {
/**
* 注意:返回值一定要用复合类型来接收,并判断是否为null。
* 网络异常会导致返回为null。
* 比如:不能直接将返回转义为int boolean等,需要是封装类型 Integer Boolean 。
* 如:boolean result = (Boolean)ServiceClient.service(url,"sample.StudentService", "delete", 1);
* 是错误的!!
* 应为:Boolean result = (Boolean)ServiceClient.service(url,"sample.StudentService", "delete", 1);
* 因为result有可能为null。
* @param url 服务地址
* @param className 类名,要求为全类名,如: mmb.service.order.OrderService, 可以省略: mmb.service,相当于只在mmb.service下查找指定的类。
* @param method 调用的方法名
* @param params 参数列表
* @return 返回值
*/
public static Object service(String url,String className,String method, Object ... params ){
HessianProxyFactory factory=new HessianProxyFactory();
factory.setConnectTimeout(5000);
factory.setReadTimeout(5000);
try {
HessianService service=(HessianService) factory.create(HessianService.class, url);
return service.service(className, method, params);
} catch (MalformedURLException e) {
e.printStackTrace();
}
return null;
}
/**
* 注意:返回值一定要用复合类型来接收,并判断是否为null。
* 网络异常会导致返回为null。
* 比如:不能直接将返回转义为int boolean等。
* 如:boolean result = (Boolean)ServiceClient.service(url,"sample.StudentService", "delete", 1);
* 是错误的!!
* 应为:Boolean result = (Boolean)ServiceClient.service(url,"sample.StudentService", "delete", 1);
* 因为result有可能为null。
* @param url 服务地址
* @param outtime 超时时长(毫秒)
* @param className 类名,要求为全类名,如: mmb.service.order.OrderService, 可以省略: mmb.service,相当于只在mmb.service下查找指定的类。
* @param method 调用的方法名
* @param params 参数列表
* @return 返回值
*/
public static Object service(String url, long outtime,String className,String method, Object ... params ){
HessianProxyFactory factory=new HessianProxyFactory();
factory.setConnectTimeout(outtime);
factory.setReadTimeout(outtime);
try {
HessianService service=(HessianService) factory.create(HessianService.class, url);
return service.service(className, method, params);
} catch (MalformedURLException e) {
e.printStackTrace();
}
return null;
}
public static void main(String args[]){
// 定义该Url,在访问该url的时候会 通过拦截器进入指定的类中 (参考web.xml)
String url="http://127.0.0.1:8080/hessianPro/enter/rpc/hes.jsp";
int deliver = (Integer)ServiceClient.service(url, "www.hessian.ware.OrderService", "getCount", 0);
System.out.println(deliver);
}
}
分享到:
相关推荐
这些示例可能包括了服务器端的服务接口和实现、web.xml配置、客户端的HessianProxyFactory使用,以及如何发起请求和处理响应的代码。 通过研究这些示例,你可以更深入地了解Hessian的工作流程,并学习如何在实际...
Hessian是一种高效的RPC(Remote Procedure Call)协议,它允许Java应用...通过学习这个Demo,你可以掌握如何设置Hessian服务端和客户端,以及如何进行远程方法调用,这对于构建分布式系统和服务有着重要的实践价值。
在IT行业中,跨平台通信是常见的需求,而Hessian作为一种二进制协议,因其轻量级、...在实际开发中,开发者需要理解Hessian的工作原理,熟练掌握两端的库使用,确保数据正确传输和解析,从而实现高效稳定的远程调用。
【描述】提供的教程包含了服务器端和客户端的实例代码,这两个例子旨在帮助开发者快速理解和应用Hessian。它们非常直观,可以直接运行,无需复杂配置,从而让你对Hessian的工作原理有深刻的理解。 首先,我们来了解...
在IT行业中,Hessian是一种流行的二进制RPC(Remote Procedure Call)协议,它允许服务器和客户端之间高效地交换数据和调用服务。本篇将详细探讨Hessian在实战中的应用,特别是如何获取客户端请求的URL以及如何...
在提供的"**hessian-android使用案例**"文件中,可能包含了一个完整的示例项目,包括服务器端的Java代码和Android客户端的Java或Kotlin代码。通过研究这些代码,你可以更直观地了解Hessian在实际项目中的应用方式。 ...
在这个“hessian服务端 客户端 可运行”的压缩包文件中,很可能包含了一个完整的示例,让我们来详细探讨Hessian在服务端和客户端的实现及其重要性。 首先,我们来理解一下Hessian服务端。在Java中,Hessian服务端...
2. 服务端:暴露服务,定义服务接口和实现类,启动HessianServlet,绑定到指定的URL。 3. 调用:通过代理对象调用服务接口的方法,Hessian会自动完成网络通信和序列化/反序列化操作。 五、示例——rpc4j-sample-web...
具体的配置和实现细节未在描述中给出,但通常涉及Spring的bean配置、服务接口的实现以及客户端的Spring上下文初始化。 总的来说,Hessian提供了轻量级的远程调用解决方案,适合对性能有较高要求且希望避免复杂SOAP...
这个"FileUploader"压缩包很可能是包含了实现上述功能的源代码,包括服务器端的Hessian服务、Spring配置文件、客户端的调用示例等。通过学习和分析这些代码,你可以更深入地理解如何将Hessian和Spring结合,实现在...
该库提供了服务器端和客户端的实现,并处理了序列化和反序列化的细节。 下面,我们来看看Hessian案例代码的一些关键部分: 1. **服务端(Server)**: - 首先,定义一个服务接口或者服务类,其中包含要暴露给...
这个小例子将带你了解如何在Java环境中实现Hessian服务的客户端和服务器端。让我们深入探讨Hessian的核心概念以及如何在实际项目中应用。 首先,Hessian的目标是提供一种简单、快速、跨语言的序列化和远程调用机制...
Hessian-4.0.7.jar是Java实现的Hessian库,提供了服务器端和客户端的实现,使得Java应用可以方便地提供和调用Hessian服务。 Hessiancsharp.dll则是Hessian协议在C#平台上的实现,它允许.NET应用程序与使用Hessian-...
2. **服务消费**:在客户端,开发者创建一个代理类,这个代理类是服务器端服务接口的实现,通过Hessian连接到服务器,实现远程调用。 三、`HessianServer`和`HessianClient`示例解析: `HessianServer`通常是一个...
- 在服务器端,需要将实现类绑定到一个特定的URL,以便客户端可以通过该URL调用。这通常通过创建一个HessianServlet并将其部署在Web服务器上来完成。HessianServlet会自动处理HTTP请求,并将方法调用转发到对应的...
开发者通常会使用Hessian库来实现客户端和服务端之间的通信,使得Android应用可以调用远程服务端的方法,就像调用本地方法一样方便。 3. **Hessian库的集成**:在Android项目中,需要引入支持Android的Hessian库,...
这里我们提供了一个使用Hessian 4.0.37的简单实例,包括服务器端和客户端的创建。 #### 服务器端(Server) 首先,定义一个服务接口和其实现: ```java public interface HelloWorldService { String sayHello...
源代码通常包括服务器端和客户端两部分,它们展示了如何定义服务接口、实现服务、发布服务以及如何调用这些服务。 1. **Hessian服务接口定义**: 在Java中,服务通常定义为一个接口,包含若干个需要远程调用的方法...
2. Hessian服务器端:接收来自客户端的Hessian请求,解析数据,执行相应的服务方法,并将结果返回给客户端,同样是以Hessian格式。 3. 类型编码:Hessian定义了一套编码规则,可以有效地序列化和反序列化各种Java...
本示例着重介绍如何在Spring和SpringMVC框架中集成Hessian RPC,以实现客户端和服务端的通信。 Hessian是一种轻量级的二进制Web服务协议,由Caucho公司开发。它具有较高的传输效率,支持Java和.NET等多种语言,特别...