`
longgangbai
  • 浏览: 7328541 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Burlap中hessian协议研究(五)协议的代理的实现

阅读更多

   在远程访问中服务端生成响应的骨架,在客户端访问远程服务必须使用响应的代理,

我们(⊙o⊙)看一看远程骨架类和远程代理的源代码分析吧。

  注意在看源代码时你必须学会反射机制哦,如果不会可以首先查看

  JDK API慢慢看也可以(⊙o⊙)哦

  反射机制使用很广泛希望不会的同时可以参考我的  Java基础有类似反射基础的东东个(⊙o⊙)哦

 同时必须Java的网络编程否则可能头疼?(+﹏+)~狂晕

 

  开始分析了~\(≧▽≦)/~啦啦啦~\(≧▽≦)/~啦啦啦

  客户端必须使用BurlapProxyFactory类

 

远程服务代理

package com.caucho.burlap.client;

 

import com.caucho.burlap.io.AbstractBurlapInput;

import com.caucho.burlap.io.BurlapOutput;

import java.io.*;

import java.lang.reflect.*;

import java.net.*;

使用JDK动态代理的实现代理

publicclass BurlapProxy

    implements InvocationHandler

{

 

    BurlapProxy(BurlapProxyFactory factory, URL url)

    {

        _factory = factory;

        _url = url;

    }

 

    public URL getURL()

    {

        return_url;

    }

 

   

动态代理必须实现的方式

    public Object invoke(Object proxy, Method method, Object args[])

        throws Throwable

    {

        String methodName;

        InputStream is;

        methodName = method.getName();

        Class params[] = method.getParameterTypes();

        if(methodName.equals("equals") && params.length == 1 && params[0].equals(java.lang.Object.class))

        {

            Object value = args[0];

            if(value == null || !Proxy.isProxyClass(value.getClass()))

            {

                returnnew Boolean(false);

            } else

            {

                BurlapProxy handler = (BurlapProxy)Proxy.getInvocationHandler(value);

                returnnew Boolean(_url.equals(handler.getURL()));

            }

        }

        if(methodName.equals("hashCode") && params.length == 0)

            returnnew Integer(_url.hashCode());

        if(methodName.equals("getBurlapType"))

            return proxy.getClass().getInterfaces()[0].getName();

        if(methodName.equals("getBurlapURL"))

            return_url.toString();

        if(methodName.equals("toString") && params.length == 0)

            return"BurlapProxy[" + _url + "]";

        is = null;

        Object obj;

        try

        {

            创建URLConnection对象根据url获取相应的响应流由上面的MicroBurlapOutput可以知道输出的流一定是一个关于服务信息的xml文件。

            URLConnection conn = _factory.openConnection(_url);

            conn.setRequestProperty("Content-Type", "text/xml");

            获取响应的信息

            OutputStream os = conn.getOutputStream();

            将响应的信息进行封装

            BurlapOutput out = _factory.getBurlapOutput(os);

            if(_factory.isOverloadEnabled())

                if(args != null)

                    methodName = methodName + "__" + args.length;

                else

                    methodName = methodName + "__0";

            out.call(methodName, args);

            os.flush();

            if(conn instanceof HttpURLConnection)

            {

                HttpURLConnection httpConn = (HttpURLConnection)conn;

                int code = 500;

                try

                {

                    code = httpConn.getResponseCode();

                }

                catch(Exception e)

                {

                    thrownew BurlapRuntimeException(String.valueOf(e));

                }

                注意响应的代码号非200即出现异常信息必须是处理异常,封装发送值客户端信息

                if(code != 200)

                {

                    StringBuffer sb = new StringBuffer();

                    try

                    {

                        is = httpConn.getInputStream();

                        int ch;

                        if(is != null)

                        {

                            while((ch = is.read()) >= 0)

                                sb.append((char)ch);

                            is.close();

                        }

                        is = httpConn.getErrorStream();

                        if(is != null)

                            while((ch = is.read()) >= 0)

                                sb.append((char)ch);

                    }

                    catch(FileNotFoundException e)

                    {

                        thrownew BurlapRuntimeException(String.valueOf(e));

                    }

                    catch(IOException e) { }

                    if(is != null)

                        is.close();

                    thrownew BurlapProtocolException(sb.toString());

                }

            }

catch(IOException e) { }

                    if(is != null)

                        is.close();

                    thrownew BurlapProtocolException(sb.toString());

                }

            }

            is = conn.getInputStream();

            AbstractBurlapInput in = _factory.getBurlapInput(is);

            obj = in.readReply(method.getReturnType());

        }

        catch(BurlapProtocolException e)

        {

            thrownew BurlapRuntimeException(e);

        }

        if(is != null)

            is.close();

        return obj;

 

    }

 

    private BurlapProxyFactory _factory;

    private URL _url;

}

分享到:
评论

相关推荐

    Hessian 接口 Java Python.docx

    Hessian和Burlap是两种高效且简洁的网络通信协议,尤其适用于需要高性能但又不想增加过多协议复杂性的应用程序。Hessian是一种小型的二进制协议,它专注于数据的高效传输,而Burlap则是一种匹配的XML协议,提供了一...

    Java远程通讯可选技术及原理

    Hessian和Burlap是二进制和文本的RPC协议,它们提供了轻量级的远程调用解决方案,适合对性能要求较高的场景。 JMS(Java Message Service)是Java平台的消息队列标准,它允许应用程序之间异步发送和接收消息,适用...

    Java远程技术.pdf

    - Hessian和Burlap:基于HTTP协议的远程通信技术,用于序列化Java对象。 - EJB(Enterprise JavaBeans):一种用于开发企业级应用的Java组件架构,支持远程通信。 6. 网络协议与Java远程通信的关系: - TCP/UDP...

    spring remoting

    3. Hessian和Burlap:这两种协议是基于HTTP的轻量级二进制协议,它们提供了更高效的序列化机制。Hessian是二进制的,而Burlap是基于XML的,两者都提供了自动类型转换的能力,使得跨语言调用成为可能。 4. JMS(Java...

    Spring+Hibernate+Xfire实现远程分布式调用

    Spring还提供了一个服务代理模型,可以方便地将本地服务包装为远程服务,或者消费远程服务,如RMI、Hessian或 Burlap等协议。 Hibernate作为ORM工具,使得开发者可以避免直接操作SQL,而是通过Java对象来与数据库...

    org.jflux.impl.transport.qpid-0.1.4.zip

    1. **Spring Remoting**: Spring Remoting是Spring框架的一部分,它提供了一种声明式的远程调用方式,支持RMI、HTTP、Hessian、 Burlap等多种协议。Spring Remoting-AMQP扩展了这一功能,增加了对AMQP的支持。 2. *...

    spring依赖包讲解.doc

    Caucho的Burlap和Hessian库(burlap-2.1.12.jar和hessian-2.1.12.jar)提供了两种轻量级的远程调用协议,Spring支持它们以实现跨网络通信。 CGLIB(cglib-full-2.0.2.jar)是另一个重要的依赖,它用于生成动态代理...

    simple-parent

    2. ** Burlap**:与Hessian类似,Burlap也是一种RPC协议,但它使用XML进行序列化,因此具有更好的可读性,但可能会牺牲一些性能。 3. **Web Services (SOAP/WSDL)**:这种基于标准的远程调用方式提供了高度的互操作...

    spring框架各jar包详解

    Spring 远程调用(remoting)对大量不同种类的协议包括 Caucho 的 Burlap 和 Hessian 提供了支持。要用哪个协议就包含这个分组里相应的 JAR 文件。 cglibcglib-full-2.0.2.jar CGLIB 用来生成动态代理类(dynamic ...

    rpc 远程调用

    Java中常见的序列化库有Hessian、Burlap、protobuf、Jackson等。 3. **网络通信框架**:Netty是一个高性能、异步事件驱动的网络应用框架,常用于构建RPC框架。它提供了高效的IO处理,支持多种传输协议,并且具有很...

    基于Spring的RPC通讯模型的使用与比较

    Hessian是一个序列化工具,可以将Java对象序列化成二进制流,而Burlap是一个 RPC 框架,使用Hessian序列化工具来实现RPC调用。 (三)HTTP Invoker HTTP Invoker是Spring自带的RPC解决方案,它使用HTTP协议来传输...

    spring rmi 简单应用

    同时,RMI也可以与Spring的其他远程服务支持,如Hessian、 Burlap等相结合,实现不同类型的远程调用。 总的来说,Spring RMI为开发者提供了一种简洁且强大的方式来实现分布式系统的组件交互,降低了远程服务开发的...

    Spring包的依赖关系

    - **说明**: Spring远程调用支持多种协议,包括Caucho的Burlap和Hessian。根据所选协议,包含相应JAR文件即可。 ### 5. CGLIB - **JAR文件**: cglib-full-2.0.2.jar - **说明**: CGLIB用于生成动态代理类,这是...

    java项目使用spring rmi所涉及到的包

    - `org.springframework.remoting`: 这是Spring的远程调用支持包,包含了各种远程调用协议的实现,如HTTP Invoker、Hessian、 Burlap等。尽管不是直接针对RMI,但提供了远程调用的通用抽象。 - `org.spring...

    spring远程调用简单实例

    Spring支持多种远程调用协议,如RMI(Remote Method Invocation)、Hessian、 Burlap以及HTTP Invoker等。这些协议允许我们跨越网络边界,像调用本地方法一样调用远程服务。 在本实例中,我们关注的是HTTP Invoker...

    springRMI接口实现

    8. **替代方案**:随着技术的发展,Spring RMI已经被其他更现代的远程调用协议如Hessian、 Burlap、JMS、RESTful API等所取代。这些协议提供了更好的跨语言支持、更高的性能和更丰富的功能。 理解并熟练掌握Spring ...

    spring学习笔记

    Spring支持RMI、HTTP、Hessian和 Burlap等协议的远程服务调用,使分布式系统间的通信变得更加简单。 **7. Spring MVC** Spring MVC是Spring提供的Web层框架,用于构建RESTful风格的Web应用。它简化了MVC模式的实现...

    Spring3.0xMVC jar包关系

    - **说明**:Spring支持多种远程调用协议,包括Caucho的Burlap和Hessian。根据你选择的协议,需要包含相应的JAR文件。 5. **CGLIB** - **JAR文件**:cglib-full-2.0.2.jar - **说明**:CGLIB用于生成动态代理类...

    rmi实例(Spring整合)

    在IT行业中,远程方法调用(Remote Method Invocation,简称RMI)是Java平台提供的一种用于在分布式环境中实现对象间通信的技术。Spring框架作为Java企业级应用的基石,它提供了与RMI集成的能力,使得开发者可以方便...

Global site tag (gtag.js) - Google Analytics