`
dyccsxg
  • 浏览: 205261 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类

Java远程方法调用

    博客分类:
  • Java
阅读更多
// 参考:http://book.csdn.net/bookfiles/269/10026911927.shtml
// remote.server.SimpleServer.java
package remote.server;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Method;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;

import share.call.Call;


/**
 *@date 2010-3-13 下午04:38:44
 *@author dycc
 */
public class SimpleServer {
	private Map<String,Object> objs = new HashMap<String,Object>();
	private ObjectInputStream in;
	private ObjectOutputStream out;
	
	public void service()throws IOException{
		ServerSocket server_socket = new ServerSocket(8002);
		System.out.println("----- server started. -----");
		while(true){
			try{
    			Socket socket = server_socket.accept();
    			// ObjectInputStream 会发生阻塞!!
    			in = new ObjectInputStream(socket.getInputStream());
    			Call call = (Call)in.readObject();
    			System.out.println("-- get call [" + call.getClassName()
    					           + ":" + call.getMethodName() + "]");
    			call = invoke(call);
    			out = new ObjectOutputStream(socket.getOutputStream());
    			out.writeObject(call);
    			out.flush();
			} catch(Exception e){
				e.printStackTrace();
			} finally{
				try{
					if(in != null){
						in.close();
					}
					if(out != null){
						out.close();
					}
				} catch(Exception e){
				}
			}
		}
	}
	
	public Call invoke(Call call){
		Object obj = objs.get(call.getClassName());
		if(obj == null){
			try {
	            obj = Class.forName(call.getClassName()).newInstance();
	            objs.put(call.getClassName(), obj);
            } catch (Exception e) {
	            e.printStackTrace();
            }
		}
		try {
	        Method method = obj.getClass().getMethod(
	        			    call.getMethodName(),
	        			    call.getParamTypes());
	        Object result = method.invoke(obj, call.getParams());
	        call.setResult(result);
        } catch (Exception e) {
	        e.printStackTrace();
        }
		return call;
	}
	
	public static void main(String[] args)throws Exception{
		SimpleServer server = new SimpleServer();
		server.service();
	}
}

// remote.service.HelloService.java
package remote.service;

import java.util.Date;

/**
 *@date 2010-3-13 下午04:29:29
 *@author dycc
 */
public interface HelloService {
	public String echo(String msg);
	public Date getTime();
}

// remote.service.HelloServiceImpl.java
package remote.service;

import java.util.Date;

/**
 *@date 2010-3-13 下午04:30:44
 *@author dycc
 */
public class HelloServiceImpl implements HelloService{
	public String echo(String msg) {
	    return "echo:" + msg;
	}
	public Date getTime() {
	    return new Date();
	}
}

// share.call.Call.java
package share.call;

import java.io.Serializable;

/**
 *@date 2010-3-13 下午04:32:04
 *@author dycc
 */
public class Call implements Serializable{
	/**
     * 
     */
    private static final long serialVersionUID = 1L;
	private String className;
	private String methodName;
	@SuppressWarnings(value="unchecked")
	private Class[] paramTypes;
	private Object[] params;
	private Object result;
	
	public Call(){
		
	}
	@SuppressWarnings(value="unchecked")
	public Call(String className,String methodName,
			Class[] paramTypes,Object[] params){
		this.className = className;
		this.methodName = methodName;
		this.paramTypes = paramTypes;
		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;
    }
	@SuppressWarnings(value="unchecked")
	public Class[] getParamTypes() {
    	return paramTypes;
    }
	@SuppressWarnings(value="unchecked")
	public void setParamTypes(Class[] paramTypes) {
    	this.paramTypes = paramTypes;
    }
	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;
    }
	public String toString(){
		StringBuffer sb = new StringBuffer();
		sb.append("{className=" + className);
		sb.append(",methodName=" + methodName);
		sb.append(",result=" + result);
		sb.append("}");
		return sb.toString();
	}
}

// locale.client.SimpleClient.java
package locale.client;

import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;

import share.call.Call;

/**
 *@date 2010-3-13 下午04:58:48
 *@author dycc
 */
public class SimpleClient {
	private ObjectInputStream in;
	private ObjectOutputStream out;
	
	public void invoke(){
		try{
    		Socket socket = new Socket("localhost",8002);
    		out = new ObjectOutputStream(socket.getOutputStream());
    		Call call = new Call("remote.service.HelloServiceImpl",
    				"getTime",new Class[]{},new Object[]{});
    		out.writeObject(call);
    		out.flush();
    		// ObjectInputStream 会发生阻塞!!
    		in = new ObjectInputStream(socket.getInputStream());
    		call = (Call)in.readObject();
    		System.out.println("result=" + call.getResult());
		} catch(Exception e){
			e.printStackTrace();
		} finally{
			try{
				if(in != null){
					in.close();
				}
				if(out != null){
					out.close();
				}
			} catch(Exception e){
			}
		}
	}
	
	public static void main(String[] args){
		SimpleClient client = new SimpleClient();
		client.invoke();
	}
}

 

分享到:
评论

相关推荐

    java远程方法调用

    ### Java远程方法调用(RMI):深入解析与实践 #### 一、RMI概念与原理 Java远程方法调用(Remote Method Invocation,简称RMI)是Java平台提供的一种分布式计算模型,允许一个Java虚拟机(JVM)上的对象通过网络...

    java 远程方法调用

    Java 远程方法调用(Remote Method Invocation,RMI)是一种在分布式环境中执行对象方法的技术。它允许一个Java应用程序调用运行在不同JVM(Java虚拟机)上的另一个对象的方法,就像是在本地调用一样。在Java RMI中...

    自己的Java远程方法调用组件

    Java远程方法调用(Remote Method Invocation,简称RMI)组件是一种关键的技术,它允许Java应用程序在不同的网络节点之间透明地调用对象的方法,仿佛这些对象都在本地进程中一样。这种技术在构建分布式系统、大型...

    java 远程方法调用(java rmi)

    Java 远程方法调用(Java RMI,Remote Method Invocation)是Java平台提供的一种用于构建分布式应用程序的技术。它允许一个对象在某个Java虚拟机(JVM)上执行的方法调用另一个在不同JVM上的对象的方法,仿佛它们是...

    Java远程方法调用(RMI)

    Eclipse 插件RMI Plug-in for Eclipse 2.0 博文链接:https://robinjie.iteye.com/blog/34606

    Java远程方法调用.pdf

    标题和描述中都提到了“Java远程方法调用”,这是指Java RMI(Remote Method Invocation)技术。Java RMI是Java编程语言中一种用于实现远程过程调用的应用程序接口,它使用对象序列化方式在不同虚拟机之间传递对象,...

    优质精品课程推荐 武汉大学Java语言程序设计教程 第11章 java远程方法调用(共44页).ppt

    Java远程方法调用(RMI,Remote Method Invocation)是Java编程中的一个重要概念,它使得一个Java程序能够调用网络中另一台计算机上的Java方法,如同调用本地方法一样。RMI是Java开发分布式应用程序的关键技术,它极...

    java_RMI1Java远程方法调用

    Java远程方法调用是一种分布式系统技术。它允许一个java虚拟机调用运行在网络中另一个地方的JVM上的对象方法. 这种技术对开发大型系统尤为重要,因为它使得在多台机器上分布资源和处理负载的想法成为可能。

    rmi java 远程方法调用

    2. **类型安全**:由于使用Java语言,RMI提供了类型安全的远程调用。 3. **高性能**:RMI可以利用Java的自动内存管理和垃圾收集机制,减少资源消耗。 ### RMI的劣势 1. **平台依赖**:虽然Java有“一次编写,到处...

    java远程调用方法总结

    Java远程方法调用(Remote Method Invocation,简称RMI)是Java平台中用于分布式计算的核心技术。它允许一个Java对象在一台机器上调用另一台机器上的对象的方法,仿佛这些方法是在本地对象上调用一样。本篇文章将对...

    三种方式实现java远程调用(rmi),绝对可用

    在提供的压缩包文件中,"三种方式(原始方式_spring_jndi)实现java远程调用(rmi)"包含了相关的示例代码,帮助开发者理解并实践这三种RMI实现方法。在MyEclipse或其他Java开发环境中导入这些代码,可以进行调试和...

    Java远程方法调用实践

    Java远程方法调用实践 Java远程方法调用实践是一种允许Java对象之间通过网络进行通信和交互的技术。它允许Java对象在不同的虚拟机上运行,并且可以在这些虚拟机之间进行通信和交互。Java远程方法调用实践基于Java...

    RMI - Java远程方法调用

    2. **远程实现(Remote Implementation)**:实现了远程接口的类,这些类的方法将被远程调用。实现类通常需要序列化,因为数据需要在网络上传输。 3. **远程对象注册表(Registry)**:类似于服务发现器,它是一个...

Global site tag (gtag.js) - Google Analytics