`
rowdarte
  • 浏览: 5617 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类
最新评论

Java远程方法调用中动态代理类的使用

    博客分类:
  • java
阅读更多

客户端 和 服务端公用文件
share
    |__call
    |       |__Call.java
    |__service
             |__HelloService.java
客户端代码
locale
    |__client
             |__SimpleClient.java
             |__ProxyFactory.java
             |__TcpConnector.java
服务端代码
remote
     |__server
     |        |__SimpleServer.java
     |__service
              |__HelloServiceImpl.java
程序实现目标
    客户端通过动态代理类调用服务端HelloServiceImpl.java 中的方法

 

Java代码 复制代码
  1. // share.call.Call.java   
  2. package share.call;   
  3.   
  4. import java.io.Serializable;   
  5.   
  6. /**  
  7.  *@date 2010-3-13 下午04:32:04  
  8.  *@author dycc  
  9.  *@file share.call.Call.java  
  10.  */  
  11. public class Call implements Serializable{   
  12.     /**  
  13.      *   
  14.      */  
  15.     private static final long serialVersionUID = 1L;   
  16.     private String className;   
  17.     private String methodName;   
  18.     @SuppressWarnings(value="unchecked")   
  19.     private Class[] paramTypes;   
  20.     private Object[] params;   
  21.     private Object result;   
  22.        
  23.     public Call(){   
  24.     }   
  25.     @SuppressWarnings(value="unchecked")   
  26.     public Call(String className,String methodName,   
  27.             Class[] paramTypes,Object[] params){   
  28.         this.className = className;   
  29.         this.methodName = methodName;   
  30.         this.paramTypes = paramTypes;   
  31.         this.params = params;   
  32.     }   
  33.     public String getClassName() {   
  34.         return className;   
  35.     }   
  36.     public void setClassName(String className) {   
  37.         this.className = className;   
  38.     }   
  39.     public String getMethodName() {   
  40.         return methodName;   
  41.     }   
  42.     public void setMethodName(String methodName) {   
  43.         this.methodName = methodName;   
  44.     }   
  45.     @SuppressWarnings(value="unchecked")   
  46.     public Class[] getParamTypes() {   
  47.         return paramTypes;   
  48.     }   
  49.     @SuppressWarnings(value="unchecked")   
  50.     public void setParamTypes(Class[] paramTypes) {   
  51.         this.paramTypes = paramTypes;   
  52.     }   
  53.     public Object[] getParams() {   
  54.         return params;   
  55.     }   
  56.     public void setParams(Object[] params) {   
  57.         this.params = params;   
  58.     }   
  59.     public Object getResult() {   
  60.         return result;   
  61.     }   
  62.     public void setResult(Object result) {   
  63.         this.result = result;   
  64.     }   
  65.     public String toString(){   
  66.         StringBuffer sb = new StringBuffer();   
  67.         sb.append("{className=" + className);   
  68.         sb.append(",methodName=" + methodName);   
  69.         sb.append(",result=" + result);   
  70.         sb.append("}");   
  71.         return sb.toString();   
  72.     }   
  73. }   
  74.   
  75. // share.service.HelloService.java   
  76. package share.service;   
  77.   
  78. import java.util.Date;   
  79.   
  80. /**  
  81.  *@date 2010-3-13 下午04:29:29  
  82.  *@author dycc  
  83.  *@file share.service.HelloService.java  
  84.  */  
  85. public interface HelloService {   
  86.     public String echo(String msg);   
  87.     public Date getTime();   
  88. }   
  89.   
  90. // locale.client.SimpleClient.java   
  91. package locale.client;   
  92.   
  93. import share.service.HelloService;   
  94.   
  95. /**  
  96.  *@date 2010-3-13 下午04:58:48  
  97.  *@author dycc  
  98.  *@file locale.client.SimpleClient.java  
  99.  */  
  100. public class SimpleClient {   
  101.     /**  
  102.      * 通过代理类调用远程方法  
  103.      */  
  104.     public void invoke(){   
  105.         HelloService hello = (HelloService)ProxyFactory.getProxy(   
  106.                 HelloService.class,"remote.service.HelloServiceImpl",   
  107.                 "localhost"8002);   
  108.         String result = hello.echo("music");   
  109.         System.out.println("result=" + result);   
  110.     }   
  111.        
  112.     public static void main(String[] args){   
  113.         SimpleClient client = new SimpleClient();   
  114.         client.invoke();   
  115.     }   
  116. }   
  117.   
  118. // locale.client.ProxyFactory.java   
  119. package locale.client;   
  120.   
  121. import java.lang.reflect.InvocationHandler;   
  122. import java.lang.reflect.Method;   
  123. import java.lang.reflect.Proxy;   
  124. import java.rmi.RemoteException;   
  125.   
  126. import share.call.Call;   
  127.   
  128. /**  
  129.  *@date 2010-3-13 下午08:21:01  
  130.  *@author dycc  
  131.  *@file locale.client.ProxyFactory.java  
  132.  */  
  133. public class ProxyFactory {   
  134.     /**  
  135.      * 获取动态代理类  
  136.      * @param classType 接口  
  137.      * @param className 实现类名称   
  138.      * @param ip        ip 地址  
  139.      * @param port      端口  
  140.      * @return  
  141.      */  
  142.     @SuppressWarnings(value="unchecked")   
  143.     public static Object getProxy(Class classType,   
  144.             final String className,   
  145.             final String ip,final int port){   
  146.         // start   
  147.         InvocationHandler handler = new InvocationHandler(){   
  148.             public Object invoke(Object proxy, Method method, Object[] args)   
  149.                     throws Throwable {   
  150.                 System.out.println("--- before " + method.getName() + "---");   
  151.                 TcpConnector connector = new TcpConnector(ip, port);   
  152.                 Call call = new Call(className,method.getName(),   
  153.                         method.getParameterTypes(),args);   
  154.                 call = (Call)connector.invoke(call);   
  155.                 Object result = call.getResult();   
  156.                 if(result instanceof Throwable){   
  157.                     return new RemoteException(method.getName() + "invoke failed",   
  158.                             (Throwable)result);   
  159.                 }   
  160.                 System.out.println("--- after " + method.getName() + "---");   
  161.                 connector.close();   
  162.                 return result;   
  163.             }   
  164.         };   
  165.         return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),   
  166.                 new Class[]{classType}, handler);   
  167.     }   
  168. }   
  169.   
  170. // locale.client.TcpConnector.java   
  171. package locale.client;   
  172.   
  173. import java.io.IOException;   
  174. import java.io.ObjectInputStream;   
  175. import java.io.ObjectOutputStream;   
  176. import java.net.Socket;   
  177.   
  178. /**  
  179.  *@date 2010-3-13 下午08:25:04  
  180.  *@author dycc  
  181.  *@file locale.client.TcpConnector.java  
  182.  */  
  183. public class TcpConnector {   
  184.     private Socket socket;   
  185.     private ObjectInputStream in;   
  186.     private ObjectOutputStream out;   
  187.     /**  
  188.      * 构造器  
  189.      * @param ip  
  190.      * @param port  
  191.      * @throws IOException  
  192.      */  
  193.     public TcpConnector(String ip,int port)throws IOException{   
  194.         socket = new Socket(ip,port);   
  195.     }   
  196.     /**  
  197.      * 调用远程方法  
  198.      * @param obj  
  199.      * @throws IOException  
  200.      */  
  201.     public Object invoke(Object obj)throws IOException,ClassNotFoundException{   
  202.         if(out == null){   
  203.             out = new ObjectOutputStream(socket.getOutputStream());   
  204.         }   
  205.         out.writeObject(obj);   
  206.         out.flush();   
  207.         if(in == null){   
  208.             in = new ObjectInputStream(socket.getInputStream());   
  209.         }   
  210.         return in.readObject();   
  211.     }   
  212.     /**  
  213.      * 关闭连接  
  214.      */  
  215.     public void close(){   
  216.         try{   
  217.             if(in != null){   
  218.                 in.close();   
  219.             }   
  220.             if(out != null){   
  221.                 out.close();   
  222.             }   
  223.             if(socket != null){   
  224.                 socket.close();   
  225.             }   
  226.         } catch(Exception e){   
  227.         }   
  228.     }   
  229. }   
  230.   
  231. // remote.server.SimpleServer.java   
  232. package remote.server;   
  233.   
  234. import java.io.IOException;   
  235. import java.io.ObjectInputStream;   
  236. import java.io.ObjectOutputStream;   
  237. import java.lang.reflect.Method;   
  238. import java.net.ServerSocket;   
  239. import java.net.Socket;   
  240. import java.util.HashMap;   
  241. import java.util.Map;   
  242.   
  243. import share.call.Call;   
  244.   
  245.   
  246. /**  
  247.  *@date 2010-3-13 下午04:38:44  
  248.  *@author dycc  
  249.  *@file remote.server.SimpleServer.java  
  250.  */  
  251. public class SimpleServer {   
  252.     private Map<String,Object> map_objs = new HashMap<String,Object>();   
  253.     private ObjectInputStream in;   
  254.     private ObjectOutputStream out;   
  255.     /**  
  256.      * 服务端在 8002 端口监听客户端请求  
  257.      * @throws IOException  
  258.      */  
  259.     public void service()throws IOException{   
  260.         ServerSocket server_socket = new ServerSocket(8002);   
  261.         System.out.println("----- server started. -----");   
  262.         while(true){   
  263.             try{   
  264.                 Socket socket = server_socket.accept();   
  265.                 // ObjectInputStream 会发生阻塞!!   
  266.                 in = new ObjectInputStream(socket.getInputStream());   
  267.                 Call call = (Call)in.readObject();   
  268.                 System.out.println("-- get call [" + call.getClassName()   
  269.                                    + ":" + call.getMethodName() + "]");   
  270.                 call = invoke(call);   
  271.                 out = new ObjectOutputStream(socket.getOutputStream());   
  272.                 out.writeObject(call);   
  273.                 out.flush();   
  274.             } catch(Exception e){   
  275.                 e.printStackTrace();   
  276.             } finally{   
  277.                 try{   
  278.                     if(in != null){   
  279.                         in.close();   
  280.                     }   
  281.                     if(out != null){   
  282.                         out.close();   
  283.                     }   
  284.                 } catch(Exception e){   
  285.                 }   
  286.             }   
  287.         }   
  288.     }   
  289.     /**  
  290.      * 调用 call 所指定的的方法  
  291.      * @param call  
  292.      * @return  
  293.      */  
  294.     public Call invoke(Call call){   
  295.         Object obj = map_objs.get(call.getClassName());   
  296.         if(obj == null){   
  297.             try {   
  298.                 obj = Class.forName(call.getClassName()).newInstance();   
  299.                 map_objs.put(call.getClassName(), obj);   
  300.             } catch (Exception e) {   
  301.                 e.printStackTrace();   
  302.             }   
  303.         }   
  304.         try {   
  305.             Method method = obj.getClass().getMethod(   
  306.                             call.getMethodName(),   
  307.                             call.getParamTypes());   
  308.             Object result = method.invoke(obj, call.getParams());   
  309.             call.setResult(result);   
  310.         } catch (Exception e) {   
  311.             e.printStackTrace();   
  312.         }   
  313.         return call;   
  314.     }   
  315.        
  316.     public static void main(String[] args)throws Exception{   
  317.         SimpleServer server = new SimpleServer();   
  318.         server.service();   
  319.     }   
  320. }   
  321.   
  322. // remote.service.HelloServiceImpl.java   
  323. package remote.service;   
  324.   
  325. import java.util.Date;   
  326.   
  327. import share.service.HelloService;   
  328.   
  329. /**  
  330.  *@date 2010-3-13 下午04:30:44  
  331.  *@author dycc  
  332.  *@file remote.service.HelloServiceImpl.java  
  333.  */  
  334. public class HelloServiceImpl implements HelloService{   
  335.     public String echo(String msg) {   
  336.         return "echo:" + msg;   
  337.     }   
  338.     public Date getTime() {   
  339.         return new Date();   
  340.     }   
  341. }  
分享到:
评论

相关推荐

    Calculator-Java-RMI:Java 远程方法调用示例

    Java 远程方法调用 (Java RMI) 是一个 Java API,它执行远程过程调用 (RPC) 的面向对象等价物,支持序列化 Java 类的直接传输和分布式垃圾收集。 远程过程调用:消息传递远程过程调用 (RPC) 是一种允许程序调用位于...

    # 动态代理的应用场.md

    通过动态代理,我们可以在运行时生成代理类,用于代理真实对象的方法调用。这种代理机制允许我们在不修改原始代码的情况下,对原始对象的行为进行扩展、增强或控制。 动态代理的应用场景非常广泛。首先,它与AOP...

    http远程接口调用-httpClient+跳过SSL证书校验

    http远程接口调用-httpClient+跳过SSL证书校验. 里面分别有3个httpClient的工具类代码。 还有一个专门为了跳过SSL证书校验的工具类。

    ASP.net 中用C#调用Java web service 图解教程

    ASP.NET 中使用 C# 调用 Java Web Service 图解教程 在本教程中,我们将学习如何在 ASP.NET 中使用 C# 调用 Java Web Service。首先,我们需要了解什么是 Web Service。 Web Service 是一种软件系统,旨在支持机器...

    JAVA_API1.6文档(中文)

    java.awt.im.spi 提供启用可以与 Java 运行时环境一起使用的输入方法开发的接口。 java.awt.image 提供创建和修改图像的各种类。 java.awt.image.renderable 提供用于生成与呈现无关的图像的类和接口。 java.awt....

    HaruRPC:基于java aio 的RPC 远程调用框架

    基于java aio 的RPC 远程调用框架 组件介绍 Serializer 序列化和反序列的工具类,项目的实现为基于Gson的序列化工具 IOHandler 从Channel中读取数据并交由Serializer处理的类,本身是异步读取数据 在读取数据时 提供...

    Java语言的反射机制.rar

    本章首先介绍了Java Reflection API的用法,然后介绍了一个远程方法调用的例子,在这个例子中客户端能够远程调用服务器端的一个对象的方法。服务器端采用了反射机制提供的动态调用方法的功能,而客户端则采用了反射...

    java api最新7.0

    里面列出了Java jdk 1.7的所有类及其使用方法! Java SE Platform 软件包: java.applet 提供创建 applet 所必需的类和 applet 用来与其 applet 上下文通信的类。 java.awt 包含用于创建用户界面和绘制图形图像的所有...

    Java 1.6 API 中文 New

    里面列出了,Java的所有类及其使用方法! Java SE Platform 软件包: java.applet 提供创建 applet 所必需的类和 applet 用来与其 applet 上下文通信的类。 java.awt 包含用于创建用户界面和绘制图形图像的所有类。 ...

    java开源包1

    brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准...

    JavaAPI1.6中文chm文档 part1

    java.awt.im.spi 提供启用可以与 Java 运行时环境一起使用的输入方法开发的接口。 java.awt.image 提供创建和修改图像的各种类。 java.awt.image.renderable 提供用于生成与呈现无关的图像的类和接口。 java.awt....

    java开源包4

    brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准...

    分布式实验报告RMI.docx

    本实验报告主要介绍了 Java RMI(Remote Method Invocation,远程方法调用)的基本概念和实现步骤。RMI 是一种分布式对象通讯机制,允许运行在一个 Java 虚拟机的对象调用运行在另一个 Java 虚拟机上对象的方法。 ...

    java开源包8

    brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准...

    JAVA上百实例源码以及开源项目

     Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。  设定字符串为“张三,你好,我是李四”  产生张三的密钥对(keyPairZhang)  张三生成公钥(publicKeyZhang...

    java开源包11

    brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准...

    java开源包6

    brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准...

    java开源包9

    brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准...

    JAVA上百实例源码以及开源项目源代码

     Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。  设定字符串为“张三,你好,我是李四”  产生张三的密钥对(keyPairZhang)  张三生成公钥(publicKeyZhang...

Global site tag (gtag.js) - Google Analytics