Util Class:
public class Call implements Serializable{
/**
* 表示类名或者接口名
*/
private String className;
/**
* 表示方法名
*/
private String methodName;
/**
* 表示方法参数类型
*/
private Class[] paramType;
/**
* 表示参数值
*/
private Object[] params;
/**
* 表示方法执行结果 如果方法正常执行,则返回正常值,如果抛出异常则返回该异常
*/
private Object result;
/**
* 无参构造方法
*/
public Call() {
}
/**
* 有参构造方法
*
* @param clasName
* @param methodName
* @param paramType
* @param params
*/
public Call(String className, String methodName, Class[] paramType,
Object[] params) {
this.className = className;
this.methodName = methodName;
this.paramType = paramType;
this.params = params;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public String getMethodName() {
return methodName;
}
public void setMethodName(String methodName) {
this.methodName = methodName;
}
public Class[] getParamType() {
return paramType;
}
public void setParamType(Class[] paramType) {
this.paramType = paramType;
}
public Object[] getParams() {
return params;
}
public void setParams(Object[] params) {
this.params = params;
}
public Object getResult() {
return result;
}
public void setResult(Object result) {
this.result = result;
}
@Override
public String toString() {
return "ClassName=" + className + ";methodName=" + methodName;
}
}
SocketServer:
package com.hou.server;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.lang.reflect.Method;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;
import com.hou.service.impl.HelloServiceImpl;
import com.hou.util.Call;
public class SimplServer {
/**
* 存放远程对象的缓存
*/
private Map remoteObjecs = new HashMap();
/**
* 存放远程对象到缓存中
*
* @param className
* @param remoteObject
*/
public void register(String className, Object remoteObject) {
remoteObjecs.put(className, remoteObject);
}
public void service() throws Exception {
ServerSocket server = new ServerSocket(8000);
System.out.println("服务器启动...");
while (true) {
Socket socket = server.accept();
InputStream inputStream = socket.getInputStream();
ObjectInputStream ois = new ObjectInputStream(inputStream);
OutputStream out = socket.getOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(out);
Call call = (Call) ois.readObject();
System.out.println("读取Obj=" + call);
call = this.invoke(call);
oos.writeObject(call);
ois.close();
oos.close();
socket.close();
}
}
/**
* Invoke execute method
*
* @param call
* @return
*/
public Call invoke(Call call) {
Object result = null;
try {
String className = call.getClassName();
String methodName = call.getMethodName();
Object[] params = call.getParams();
// 注册一个类
Class classType = Class.forName(className);
Class[] paramType = call.getParamType();
// 得到方法
Method method = classType.getMethod(methodName, paramType);
// 从缓存中取出相关的远程对象
// Object obj = remoteObjecs.get(className);
Object obj = classType.newInstance();
if (obj == null) {
throw new Exception(className + "远程对象不存在");
} else {
// 调用远程对象的方法
result = method.invoke(obj, params);
}
} catch (Exception e) {
System.out.println("出现错误了..." + e);
}
call.setResult(result);
return call;
}
public static void main(String args[]) throws Exception {
SimplServer server = new SimplServer();
server.register("com.hou.service.impl.HelloServiceImpl",
new HelloServiceImpl());
server.service();
}
}
SocketClient:
package com.hou.client;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
/**
* 客户端
*/
import com.hou.util.Call;
public class SimpleClient {
public void invoke() throws Exception {
Socket socket = new Socket("localhost", 8000);
OutputStream out = socket.getOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(out);
InputStream in = socket.getInputStream();
ObjectInputStream ois = new ObjectInputStream(in);
Call call = new Call("com.hou.service.impl.HelloServiceImpl", "echo",
new Class[] { String.class }, new Object[] { "猴哥" });
// 向服务器发送对象包
oos.writeObject(call);
// 接受服务器返回的对象包
call = (Call) ois.readObject();
System.out.println("返回结果:" + call.getResult());
ois.close();
oos.close();
socket.close();
}
public static void main(String args[]) throws Exception {
new SimpleClient().invoke();
}
}
Invoke Class:
public class HelloServiceImpl implements HelloService {
public String echo(String msg) {
return "Echo:"+msg;
}
public Date getTime() {
return new Date();
}
}
以上是利用java反射机制实现远程调用,RMI远程调用就是采用该机制。如果利用NIO远程调用时间效率更高。
分享到:
相关推荐
Java Spring 2.5 Remote Invoke HTTP Invoker 是一个基于HTTP协议的远程调用框架,它允许Spring应用通过HTTP协议来调用远程服务。这个技术在分布式系统中非常有用,因为它可以轻松地跨越网络边界,实现服务间的通信...
总的来说,Java Spring 1.2 Remote Invoke HTTP Invoker是一个强大的远程调用解决方案,它结合了HTTP协议的灵活性和Spring框架的便利性,使开发者能够轻松地构建分布式应用程序。尽管在某些场景下,现代的RPC框架如...
除了RMI,Java还提供了其他远程控制机制,如Java Remote Management Extensions(JRMP)和Java Management Extensions(JMX)。JRMP是Java内置的RMI实现,而JMX则提供了一个更高级的框架,用于管理和监控分布式系统...
在这个场景中,我们有名为"JSimpCalcWebService"的Java Web服务,它可能是由JAX-WS(Java API for XML Web Services)或者早期的JAX-RPC(Java API for XML-based Remote Procedure Calls)创建的。这些服务通常...
Java Remote Method Invocation (RMI) 是Java平台提供的一种用于创建分布式应用程序的技术,它允许对象在不同的JVM(Java虚拟机)之间通过网络进行方法调用。RMI的主要优点是其透明性,即开发者可以像调用本地方法...
RMI(即Remote Method Invoke 远程方法调用)。在Java中,只要一个类extends了java.rmi.Remote接口,即可成为存在于服务器端的远程对象,供客户端访问并提供一定的服务。
- 远程调用:在RMI(Remote Method Invocation)中,可以通过动态代理将远程方法调用包装成本地方法调用。 - 插件系统:插件可以通过动态代理实现与主程序的交互,而无需了解主程序的具体实现。 5. **源码分析**...
2. **InvocationHandler**:定义了代理对象在被调用时的行为,实现该接口并覆盖`invoke()`方法,此方法在代理对象的方法被调用时会被触发。 动态代理的应用场景包括: 1. **AOP(面向切面编程)**:通过代理对象在...
- **远程调用**:RMI(Remote Method Invocation)中的代理,允许本地对象调用远程服务器上的方法。 - **事件处理**:在GUI应用中,代理可以作为事件监听器,添加额外的功能,比如验证用户输入。 5. **代码示例**...
RPC(Remote Procedure Call)框架是Java开发中常用于构建分布式系统的重要工具,它允许一个程序在不关心远程系统具体实现的情况下调用其功能,简化了跨网络的服务调用。本篇文章将深入探讨基于Java实现的RPC框架,...
public interface HelloClientInterface extends java.rmi.Remote { public String getName(String name) throws java.rmi.RemoteException; } ``` - **创建客户端代码** 创建客户端代码以调用服务。 ```java ...
在Java中,可以使用多种技术来实现远程接口访问,如RMI(Remote Method Invocation)、SOAP/RESTful Web Services等。 2. **Webservers**:Web服务器是指在网络上提供网页访问服务的计算机程序。它不仅可以处理HTTP...
**Hprose**(High Performance Remote Object Service Engine)是一款商用开源的轻量级跨语言跨平台的面向对象的高性能远程动态通信中间件。它支持多种语言如.NET、Java、Delphi、Objective-C、ActionScript、...
- 远程调用:在RMI(Remote Method Invocation)中,动态代理可以用来创建客户端的代理,使得本地调用就像是调用本地对象一样。 - 缓存:可以使用动态代理在调用实际服务前检查缓存,如果缓存中有数据则直接返回,...
- **远程调用**:RMI(Remote Method Invocation)中,客户端通过代理对象调用远程服务器的方法。 总结来说,Java动态代理提供了一种优雅的方式来扩展和控制对象的行为,它在许多场景下都能发挥重要作用,如提高...
这可能包括RMI(Remote Method Invocation)JMX连接器或JMXMP(JMX Message Protocol)连接器,它们允许外部工具或应用程序连接到JMX服务器。 6. **客户端访问**:JMX客户端可以使用`JMXPConnector`类建立与MBean...
例如,RMI (Remote Method Invocation) 和 JAX-RPC 就是远程代理的典型应用。 2. **虚拟代理**:在需要处理大型对象或耗时操作时,代理可以在实际创建或加载对象之前提供一个轻量级的代表。例如,网页中的占位符...