`

socket 在远程方法调用中运用反射机制

 
阅读更多

反射,客户端 服务器.

接口 实现类 (传递的中间类)

 

 public interface HelloService

 public class HelloServiceImpl implements HelloService

 public class Call implements Serializable

 

public class SimpleServer  { 
        private Map remoteObj ects=new HashMap();         //存放远程对象的缓存

        /**  把一个远程对象放到缓存中*/ 
        public void register(String className,Object remoteObj ect){ 
                  remoteObj ects.put( className,remoteObj ect); 
         }

       public void service()throws Exception{ 
                ServerSocket serverSocket = new ServerSocket(8000); 
                System.out.println("服务器启动."); 
                while(true){ 
                        Socket socket=serverSocket.accept(); 
                        InputStream in=socket.getInputStream(); 
                        Obj ectInputStream ois=new Obj ectInputStream(in); 
                        OutputStream out=socket.getOutputStream(); 
                        Obj ectOutputStream oos=new Obj ectOutputStream(out);

                         Call call=(Call)ois.readObj ect();            //接收客户发送的Call 对象 
                         System.out.println(call); 
                         call=invoke(call);                            //调用相关对象的方法 
                         oos.writeObj ect(call);                       // 向客户发送包含了执行结果的Call 对象

                         ois.close(); 
                         oos.close(); 
                         socket.close(); 
                } 
          }

          public Call invoke(Call call){

                    Obj ect result=null; 
                    try{ 
                          String className=call.getClassName(); 
                          String methodName=call.getMethodName(); 
                          Obj ect[] params=call.getParams(); 
                          Class classType=Class.forName(className); 
                           Class[] paramTypes=call.getParamTypes(); 
                           Method method=classType.getMethod(methodName,paramTypes); 
                          Obj ect remoteObj ect=remoteObj ects.get(className);                   //从缓存中取出相关的远程对象 
                           if(remoteObj ect==null){ 
                                     throw new Exception(className+"的远程对象不存 "); 
                            }else{ 
                                     result=method.invoke(remoteObject,params); 
                             } 
                        }catch(Exception e){result=e;}

                  call.setResult(result);                                                  //设置方法执行结果 
                   return call; 
              }

              public static void main(String args[])throws Exception { 
                         SimpleServer server=new SimpleServer(); 
                         //把事先创建的HelloServiceImpl 对象加入到服务器的缓存中 
                         server.register("remotecall.HelloService",new HelloServiceImpl()); 
                         server.service(); 
               }

 

              public class SimpleClient  { 
                         public void invoke()throws Exception{ 
                         Socket socket = new Socket("localhost",8000); 
                         OutputStream out=socket.getOutputStream(); 
                         Obj ectOutputStream oos=new Obj ectOutputStream(out); 
                         InputStream in=socket.getInputStream(); 
                         Obj ectInputStream ois=new Obj ectInputStream(in);

                         //Call call=new Call("remotecall.HelloService","getTime",
                                                             new Class[]{},new Obj ect[]{}); 
                          Call call=new Call("remotecall.HelloService","echo",
                                                                           new Class[]{String.class},new Obj ect[]{"Hello"}); 
                          oos.writeObject(call);                                                  // 向服务器发送Call 对象 
                          call=(Call)ois.readObj ect();                                       //接收包含了方法执行结果的Call 对象 
                          System.out.println(call.getResult());

                          ois.close(); 
                          oos.close(); 
                          socket.close(); 
                       }

                      public static void main(String args[])throws Exception {

                               new SimpleClient().invoke();
                          } 
                  }

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    Java使用传统socket手写的远程RPC框架调用框架

    在RPC框架中,动态代理用于拦截客户端对服务接口的调用,将本地调用转换为远程调用。通过实现InvocationHandler接口,我们可以自定义调用处理逻辑,将方法名、参数等信息封装成请求消息,通过Socket发送给服务端。 ...

    JAVA Socket远程执行任务

    - **执行命令**:找到jar包中的main方法,通过反射机制调用这个方法执行任务。 - **返回结果**:执行完成后,将结果编码为字节流,通过Socket的输出流向客户端发送。 4. **安全考虑**: 这种远程执行命令的方式...

    基于IOCP的远程函数调用(XE2用了RTTI)

    3. 在本项目中,RTTI可能用于动态地调用远程对象的方法,实现函数的远程调用。 4. 使用System.Rtti单元,可以创建TValue对象来表示任意类型的值,并通过TRttiContext和TRttiMethod等类进行操作。 RPC(远程过程调用...

    详解java中反射机制(含数组参数)

    Java 中的反射机制(含数组参数) Java 中的反射机制是一种强大的工具,可以在运行时获取类的内部信息,包括modifiers、...在实际应用中,反射机制可以应用于远程调用方法、生成动态类、实现依赖注入等场景。

    Java反射概念及例子

    在 Java RMI 的实现中,反射是实现方法远程调用的关键技术。而像 JNDI、EJB、Web Service 等 JavaEE 技术,虽然它们是基于 RMI 的,但其背后也离不开反射技术的支持。 在使用反射技术时,Java 程序可以执行以下操作...

    基于socket的rpc

    在客户端,我们定义了一个接口,通过反射机制将方法调用转换为网络消息。这个`reflectInterfaceTest`可能就是用于测试接口反射的代码,确保客户端能够正确地将方法名、参数类型和参数值序列化并发送给服务器。`...

    比较原始的方案实现RPC框架,采用Socket通信、动态代理与反射与Java原生的序列化

    比较原始的方案实现RPC框架,采用Socket通信、动态代理与反射与Java原生的序列化 1)服务提供者,运行在服务器端,提供服务接口定义与服务实现类。 2)服务中心,运行在服务器端,负责将本地服务发布成远程服务,...

    rmi原理及应用ppt

    - 在Java 1.2之后,RMI不再需要Skeleton,而是通过反射机制实现远程方法调用。 - 客户端和服务端通过定义好的接口进行交互,这个接口层负责处理远程对象引用的创建和管理。 - 请求/应答消息的传输由底层的通信层...

    JAVA实现简单RPC框架

    - **客户端代理**:客户端使用动态代理创建服务的本地代理对象,调用代理对象的方法发起远程调用。 - **请求打包**:客户端将调用信息(包括方法名、参数等)打包成可序列化的对象,通过Socket发送到服务端。 - *...

    rpc-example.rar

    在RPC框架中,注解可以用于标记需要暴露给远程调用的方法,或者提供其他配置信息。例如,可以自定义一个`@RPCService`注解标识服务类,`@RPCMethod`注解标识可远程调用的方法。 综上所述,“rpc-example.rar”提供...

    实现一个简单的RPC框架

    RPC(Remote Procedure Call)是一种进程间通信的技术,它允许程序在不同的网络节点上进行通信,就像调用本地函数一样调用远程系统上的函数或方法。本篇将详细讲解如何使用socket、反射和序列化等技术来实现一个简单...

    JAVA实的RPC框架

    总结以上,Java实现的RPC框架综合运用了JDK动态代理、NIO Socket通信、反射、注解、Protostuff序列化以及Zookeeper分布式协调服务,构建了一套高效、灵活的远程调用解决方案。通过理解这些核心技术,开发者可以更好...

    RPC框架几行代码就够了.docx

    * 服务暴露:暴露服务的过程,使服务可以被远程调用。 * 服务调用:客户端调用服务的过程。 * 服务处理:服务器端处理服务请求的过程。 知识点3:Java中的RPC框架实现 Java中可以使用Java反射机制和代理模式来实现...

    java面试题目汇集

    6. **通信机制**:Stub和Skeleton之间的通信通常是基于TCP/IP的Socket连接,通过ObjectOutputStream和ObjectInputStream进行对象的序列化和反序列化,以便在网络中传输。 7. **异常处理**:如果在调用过程中发生...

    抠脚的RPC实现

    当客户端调用代理对象的方法时,实际会触发`invoke()`方法,此时我们可以将调用转换为远程调用。 3. **反射机制**: 反射是Java提供的一种强大的工具,允许我们在运行时检查类、接口、字段和方法的信息,甚至可以...

    rpc的简单实现.docx

    RPC(Remote Procedure Call)是一种进程间通信机制,允许程序调用另一个远程计算机上的函数或方法,就像调用本地函数一样。在本示例中,RPC的实现基于Java,利用了反射、动态代理以及Socket进行通信。 1. **基础...

    一个来自菜鸡的RPC实现

    在RPC中,反射被用来根据接口动态创建代理对象,以及在远程服务上执行方法。 3. **序列化与反序列化(Serialization & Deserialization)**:RPC通信涉及数据传输,这需要将对象转换为可在网络上传输的字节流(序列...

    C#技术文档

    这些文档涵盖了C#的关键概念和技术,如网络编程、泛型、面向接口编程、反射、文件操作、远程方法调用以及多线程与定时器的使用等。下面将对这些主题进行详细的阐述。 1. **Socket编程**:Socket是网络通信的基础,...

    学习java要达到的30个目标

    - **学习远程方法调用(RMI)和RMI/IIOP**:掌握这两种远程调用机制的原理和实现方法。 ### 9. Java EE标准与技术 - **熟悉Java EE标准**:了解Java EE平台的主要组成和技术栈。 - **学习EJB技术**:理解会话Bean...

    C# 源码(很多的源码)

    - **Remoting**:远程方法调用,是.NET框架中实现跨进程通信的技术,允许在不同应用程序域之间调用方法。 - **ClassAndStruct**:讨论了C#中的类与结构体的区别,类是引用类型,结构体是值类型,它们在内存管理、...

Global site tag (gtag.js) - Google Analytics