`
DiaoCow
  • 浏览: 244321 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Hessian源码学习(二)客户端

阅读更多
【客户端】

我们在客户端是如何使用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
0
3
分享到:
评论

相关推荐

    hessian学习基础篇——序列化和反序列化

    例如,服务器端可以使用Hessian序列化响应数据,客户端则通过反序列化接收到的二进制流来获取对象。这使得通信过程更为高效,尤其在数据量较大时,相比于文本格式,二进制格式能显著减少网络传输时间。 Hessian工具...

    Hessian 学习 例子 实例

    至于标签"源码",学习Hessian时查看源码有助于理解其内部工作原理,比如数据如何被编码和解码。你可以通过阅读开源的Hessian库,如Caucho Hessian的Java实现,来了解其底层细节。 至于"工具",有一些工具可以帮助...

    Hessian

    在博客链接《iteye博客:550771》中,作者可能详细讨论了Hessian的使用方法、优缺点以及实战案例,可以作为学习Hessian的参考资料。 **六、Hessian的使用场景** 1. **微服务通信**:在微服务架构中,Hessian可以...

    Flex + Hessian 学习笔记(二)

    10. **源码分析**:通过阅读和理解提供的"src"文件,我们可以深入学习Flex客户端如何与Hessian服务通信的细节,以及可能遇到的问题和解决方案。 11. **HessianFlexClient.swf**:这个SWF文件可能是示例Flex客户端...

    Hessian学习笔记

    4. **Hessian客户端和服务器实现**:理解如何在Java或其他支持的语言中实现Hessian客户端和服务端是学习的关键。这包括创建服务端的HessianServlet,以及客户端的HessianProxyFactory,用于创建远程服务的代理对象。...

    hessian

    Hessian是一种二进制Web服务协议,它由Caucho Technology...通过深入学习和理解Hessian的源码,开发者可以更好地优化自己的服务,提升系统的稳定性和性能。同时,熟悉相关工具的使用也能提高开发效率,使项目更加健壮。

    hessian php与java通讯demo源码

    总之,这个"PHP与Java通信Demo源码"是一个很好的学习资源,帮助开发者理解如何在PHP和Java之间使用Hessian协议进行通信。通过分析和实践这些示例代码,你可以更好地掌握Hessian的工作原理和使用方式,为你的跨语言...

    spring整合hessian进行远程通讯

    标题中的“spring整合hessian进行远程通讯”是指在Spring框架中使用Hessian库来实现远程过程调用(RPC)。...在实际开发中,我们需要结合源码学习,了解其实现原理,并注意安全性和性能优化,确保系统的稳定运行。

    Java Hessian小试(转)

    Java Hessian小试(转) Java Hessian是一种二进制的RPC(远程过程调用)协议,由Caucho...在压缩包子文件"**Hessian**"中,可能包含了一些示例代码或者Hessian的实现细节,对于学习和研究Hessian的源码有一定的帮助。

    hessian-4.0.51-src

    《深入解析Hessian 4.0.51源码》 Hessian,作为一个高效轻量级的二进制Web服务协议,广泛应用于分布式系统中,它允许开发者...对于想深入理解分布式通信机制的开发者来说,研究Hessian源码无疑是一次宝贵的学习机会。

    二进制Web服务Hessian刘骥讲座--(附源码)

    通过这个讲座和附带的源码,你可以系统地学习如何利用Hessian构建高效的分布式系统,了解如何创建Hessian服务,以及如何在客户端进行调用。同时,这个过程也将帮助你理解如何在实际项目中优化通信性能,提高系统的...

    Spring中集成Hessian的问题

    Hessian是一种二进制的Web服务协议,它将Java对象序列化为高效的二进制格式,减少了网络传输的数据量。与基于XML的SOAP相比,Hessian的性能更高,因为XML解析和生成的开销较大。Hessian支持两种主要的调用类型:...

    flex-hessian-java实例.rar

    学习这个实例,你将了解到如何设置Hessian服务,配置Flex客户端连接,以及如何处理数据传输。这有助于你在构建分布式系统时,利用Flex和Java的优势,提供高性能、低延迟的跨平台通信解决方案。通过实践这些步骤,你...

    hessian-4.0.7jar文件与源代码.rar

    这个jar文件可以被Java应用程序引入,以便在客户端和服务端之间进行Hessian协议的通信。它包括了序列化和反序列化机制,以及对HTTP和HTTPS的支持,使得远程方法调用变得简单且高效。 `hessian-4.0.7-src.jar`则是...

    Hessian 入门介绍

    **Hessian入门介绍** 在IT领域,Hessian是一种二进制Web服务协议,它由Caucho Technology开发,主要用于提供...通过学习和实践`HessianDemo`,开发者能够掌握Hessian的基本用法,从而在实际项目中有效地利用这一工具。

    Hessian源代码

    学习Hessian源代码,我们可以深入了解其内部的序列化机制,例如: - **类型标记**:Hessian如何使用特定的字节来标识不同的数据类型。 - **对象引用**:如何高效地处理对象引用,避免重复序列化。 - **错误处理**:...

    Hessian(Spring集成的)的应用与研究

    2. Hessian的安全策略:学习如何在Hessian服务上实现认证和授权,防止未授权访问。 3. 性能优化:通过调整Hessian配置,如连接池大小、超时时间等,来提升服务性能。 4. 异常处理:研究如何处理Hessian通信过程中的...

    自己写了个Hessian

    通过阅读这个博客,我们可以学习到如何在实际项目中应用Hessian协议,以及如何优化自定义实现。 标签 "源码" 和 "工具" 提醒我们,这个项目不仅涉及理论知识,还包含了实际的代码实现,可能是一个工具或者库,可以...

Global site tag (gtag.js) - Google Analytics