【客户端】
我们在客户端是如何使用hessian呢?
String url = "http://localhost:8080/Hello/hello";
HessianProxyFactory factory = new HessianProxyFactory();
// IHello为调用的服务接口,url为hessian服务url
IHello helloProxy = (IHello)factory.create(IHello.class, url);
System.out.println(helloProxy.sayHello());
以上代码就可以进行Hessian的远程调用了,但是这些究竟是怎么实现的呢,我们一步步分析(参考源码版本3.0.13)。
factory.create(IHello.class, url);
通过 HessianProxyFactory(Hessian代理工厂)创建一个代理类(采用JDK自带的动态代理),具体代码如下;
public Object create(Class api, String urlName)
throws MalformedURLException
{
return create(api, urlName, Thread.currentThread().getContextClassLoader());
}
public Object create(Class api, String urlName, ClassLoader loader)
throws MalformedURLException
{
URL url = new URL(urlName);
// HessianProxy implements InvocationHandler
HessianProxy handler = new HessianProxy(this, url);
return Proxy.newProxyInstance(api.getClassLoader(),
new Class[] { api, HessianRemoteObject.class }, handler);
}
helloProxy.sayHello();
实际上是调用代理类HessianProxy的invoke方法,我们具体看下代码:
// 获取调用的方法名以及方法参数类型
String methodName = method.getName();
Class []params = method.getParameterTypes();
//对于以下方法直接执行本地调用而不是远程调用
if (methodName.equals("equals") &&
params.length == 1 && params[0].equals(Object.class)) {
Object value = args[0];
if (value == null || ! Proxy.isProxyClass(value.getClass()))
return new Boolean(false);
HessianProxy handler = (HessianProxy) Proxy.getInvocationHandler(value);
return new Boolean(_url.equals(handler.getURL()));
}
else if (methodName.equals("hashCode") && params.length == 0)
return new Integer(_url.hashCode());
else if (methodName.equals("getHessianType"))
return proxy.getClass().getInterfaces()[0].getName();
else if (methodName.equals("getHessianURL"))
return _url.toString();
else if (methodName.equals("toString") && params.length == 0)
return "[HessianProxy " + _url + "]";
// 判断客户端是否要求支持重载(即客户端是否设置factory.setOverloadEnabled(true);
//注:3.0.13 只支持参数个数不同的重载,后面版本才真正意义上的支持重载)
if (! _factory.isOverloadEnabled()) {
// 不要求重载,则什么都不做
}
else if (args != null)
// 若支持重载,则目标方法名格式为:method名 + "__" + method参数个数
methodName = methodName + "__" + args.length;
else
methodName = methodName + "__0";
// 执行远程调用(建立http链接,设置一些http header, 序列化方法名和方法参数,执行http请求...)
conn = sendRequest(methodName, args);
// 从输入流中读取远程调用结果并返回给客户端
is = conn.getInputStream();
AbstractHessianInput in = _factory.getHessianInput(is);
return in.readReply(method.getReturnType());
总结
通过上面的代码分析,我们可以看到:
1.客户端如何进行Hessian远程调用,它的原理是什么;
2.如果要支持方法重载,客户端如何设置;
整个hessian远程调用可以用以下一副图概括:
下一篇文章我们将重点来看下Hessian的序列化实现,这才是Hessian让人激动的地方!
- 大小: 29 KB
分享到:
相关推荐
c#实现的hessian的服务端和客户端,iis亲测可以通过,
使用hessian进行服务器和客户端通讯,此案例包括服务器和java客户端,参考博客:http://blog.csdn.net/tan313/article/details/49536163
hessian demo 包括服务端和客户端,绝对能用,包括了jar包
公司搞soa治理,正好采用hessian的export暴露接口,我修改了下,客户端不需要采用url,直接采用servicename,从zookeeper取地址列表。客户端和服务端通过mina通讯,不采用原生的http协议。目前mina的编码解码还有待...
hessian 服务端 客户端 可运行
hessian 服务器 客户端 demo
在android与web端实现hessian通信,源码为android客户端源码,jar包来自http://hsrong.iteye.com/blog/1719996,google官网提供的hessdroid不可用,因为里面包含一些android不支持的类;hessian官网的jar包适用于web...
项目选定Hessian作为web service的实现方式,确实很轻量级,速度就跟直接用socket差不多,全是二进制传送节约了不少开销。但是在使用过程中有业务需要是必须获得远程端的ip地址,主机名等信息的。翻便Hessian的文档...
hessian源码
Hessian 4.0.7 Jar 源码, Hessian 4.0.7 Jar 源码, Hessian 4.0.7 Jar 源码
Hessian的学习笔记
例子代码 博文链接:https://zmx.iteye.com/blog/1847571
hessian-3.2.0源码,在做分布式交互时,可能要重写hessian
java项目中使用hessian框架实现远程调用,该资源内附hessian服务端,hessian客户端和使用说明文档,以供使用参考,轻松教会你hessian远程调用!
spring springmvc hessian rpc客户端及服务端示例demo,可直接运行,适合hessian入门的同学们学习,仅供有需要的同学们参考
使用HessianCSharp编写的服务端与客户端,使用最少量的代码实现Hello
想学习Hessian的同志们,这个是一个简单的demo。比较简单,不过能够加深对Hessian的理解
这是一个Hessian入门学习的实例,程序包是一个web工程,使用intellij idea + Maven开发,其中通过两个方式展示了使用Hessian实现RMI的原理,一个是访问jsp页面,一个是在代码中手工创建client。对于Hessian Servlet...
hessian最新源码分析.pdf
Hessian android客户端异步请求访问包