反射,客户端 服务器.
接口 实现类 (传递的中间类)
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();
}
}
分享到:
相关推荐
在RPC框架中,动态代理用于拦截客户端对服务接口的调用,将本地调用转换为远程调用。通过实现InvocationHandler接口,我们可以自定义调用处理逻辑,将方法名、参数等信息封装成请求消息,通过Socket发送给服务端。 ...
- **执行命令**:找到jar包中的main方法,通过反射机制调用这个方法执行任务。 - **返回结果**:执行完成后,将结果编码为字节流,通过Socket的输出流向客户端发送。 4. **安全考虑**: 这种远程执行命令的方式...
3. 在本项目中,RTTI可能用于动态地调用远程对象的方法,实现函数的远程调用。 4. 使用System.Rtti单元,可以创建TValue对象来表示任意类型的值,并通过TRttiContext和TRttiMethod等类进行操作。 RPC(远程过程调用...
Java 中的反射机制(含数组参数) Java 中的反射机制是一种强大的工具,可以在运行时获取类的内部信息,包括modifiers、...在实际应用中,反射机制可以应用于远程调用方法、生成动态类、实现依赖注入等场景。
在 Java RMI 的实现中,反射是实现方法远程调用的关键技术。而像 JNDI、EJB、Web Service 等 JavaEE 技术,虽然它们是基于 RMI 的,但其背后也离不开反射技术的支持。 在使用反射技术时,Java 程序可以执行以下操作...
在客户端,我们定义了一个接口,通过反射机制将方法调用转换为网络消息。这个`reflectInterfaceTest`可能就是用于测试接口反射的代码,确保客户端能够正确地将方法名、参数类型和参数值序列化并发送给服务器。`...
比较原始的方案实现RPC框架,采用Socket通信、动态代理与反射与Java原生的序列化 1)服务提供者,运行在服务器端,提供服务接口定义与服务实现类。 2)服务中心,运行在服务器端,负责将本地服务发布成远程服务,...
- 在Java 1.2之后,RMI不再需要Skeleton,而是通过反射机制实现远程方法调用。 - 客户端和服务端通过定义好的接口进行交互,这个接口层负责处理远程对象引用的创建和管理。 - 请求/应答消息的传输由底层的通信层...
- **客户端代理**:客户端使用动态代理创建服务的本地代理对象,调用代理对象的方法发起远程调用。 - **请求打包**:客户端将调用信息(包括方法名、参数等)打包成可序列化的对象,通过Socket发送到服务端。 - *...
在RPC框架中,注解可以用于标记需要暴露给远程调用的方法,或者提供其他配置信息。例如,可以自定义一个`@RPCService`注解标识服务类,`@RPCMethod`注解标识可远程调用的方法。 综上所述,“rpc-example.rar”提供...
RPC(Remote Procedure Call)是一种进程间通信的技术,它允许程序在不同的网络节点上进行通信,就像调用本地函数一样调用远程系统上的函数或方法。本篇将详细讲解如何使用socket、反射和序列化等技术来实现一个简单...
总结以上,Java实现的RPC框架综合运用了JDK动态代理、NIO Socket通信、反射、注解、Protostuff序列化以及Zookeeper分布式协调服务,构建了一套高效、灵活的远程调用解决方案。通过理解这些核心技术,开发者可以更好...
* 服务暴露:暴露服务的过程,使服务可以被远程调用。 * 服务调用:客户端调用服务的过程。 * 服务处理:服务器端处理服务请求的过程。 知识点3:Java中的RPC框架实现 Java中可以使用Java反射机制和代理模式来实现...
6. **通信机制**:Stub和Skeleton之间的通信通常是基于TCP/IP的Socket连接,通过ObjectOutputStream和ObjectInputStream进行对象的序列化和反序列化,以便在网络中传输。 7. **异常处理**:如果在调用过程中发生...
当客户端调用代理对象的方法时,实际会触发`invoke()`方法,此时我们可以将调用转换为远程调用。 3. **反射机制**: 反射是Java提供的一种强大的工具,允许我们在运行时检查类、接口、字段和方法的信息,甚至可以...
RPC(Remote Procedure Call)是一种进程间通信机制,允许程序调用另一个远程计算机上的函数或方法,就像调用本地函数一样。在本示例中,RPC的实现基于Java,利用了反射、动态代理以及Socket进行通信。 1. **基础...
在RPC中,反射被用来根据接口动态创建代理对象,以及在远程服务上执行方法。 3. **序列化与反序列化(Serialization & Deserialization)**:RPC通信涉及数据传输,这需要将对象转换为可在网络上传输的字节流(序列...
这些文档涵盖了C#的关键概念和技术,如网络编程、泛型、面向接口编程、反射、文件操作、远程方法调用以及多线程与定时器的使用等。下面将对这些主题进行详细的阐述。 1. **Socket编程**:Socket是网络通信的基础,...
- **学习远程方法调用(RMI)和RMI/IIOP**:掌握这两种远程调用机制的原理和实现方法。 ### 9. Java EE标准与技术 - **熟悉Java EE标准**:了解Java EE平台的主要组成和技术栈。 - **学习EJB技术**:理解会话Bean...
- **Remoting**:远程方法调用,是.NET框架中实现跨进程通信的技术,允许在不同应用程序域之间调用方法。 - **ClassAndStruct**:讨论了C#中的类与结构体的区别,类是引用类型,结构体是值类型,它们在内存管理、...