通過java反射調用遠程方法

整體通信過程如下圖:

package search;
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;


public class SimpleServer 
{
	private Map remoteObjects=new HashMap();
	public void register(String className,Object remoteObject)
	{
		remoteObjects.put(className, remoteObject);
	}
	public void service()throws Exception
	{
		ServerSocket serverSocket=new ServerSocket(8003);
		System.out.println("server has started");
		while(true)
		{
			Socket socket=serverSocket.accept();
			InputStream in=socket.getInputStream();
			ObjectInputStream oin=new ObjectInputStream(in);
			Call call=(Call) oin.readObject();
			System.out.println(call);
			OutputStream out=socket.getOutputStream();
			ObjectOutputStream oout=new ObjectOutputStream(out);
			call=invoke(call);
			oout.writeObject(call);
			
			oin.close();
			oout.close();
			socket.close();
		}
		
	}
	private Call invoke(Call call)
	{
		Object result;
		try
		{
			String className=call.getClassName();
			String methodName=call.getMethodName();
			Object[]params=call.getParams();
			Class classType=Class.forName(className);
			Class[]paramTypes=call.getParamTypes();
			Method method=classType.getMethod(methodName,paramTypes);
			Object remoteObject=remoteObjects.get(className);
			if(remoteObject==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();
			server.register("search.HelloService", new HelloServiceImpl());
			server.service();
		
	}
}

package search;

import java.util.Date;

public class HelloServiceImpl implements HelloService
{

	public String echo(String msg) 
	{
		
		return "echo "+msg;
	}

	
	public Date getTime() 
	{
		return new Date();
	}

}

package search;

import java.util.Date;

public interface HelloService 
{
	public String echo(String msg);
	public Date getTime();
}

package search;

import java.io.Serializable;

public class Call implements Serializable
{
	private String className;//表示類名或接口名
	private String methodName;//表示方法名
	private Class[]paramTypes;//表示方法參數類型
	private Object[]params;//表示方法參數值
	//表示方法的執行結果
	private Object result;
	public Call(){}
	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;
	}
	public Class[] getParamTypes() {
		return paramTypes;
	}
	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()
	{
		return "classname= "+className+" methodname= "+methodName;
	}
	
}

package search;

import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class SimpleClient 
{
	public void invoke()
	{
		try
		{
			Socket socket=new Socket("localhost",8003);
			InputStream in=socket.getInputStream();
			OutputStream out=socket.getOutputStream();
			ObjectOutputStream oout=new ObjectOutputStream(out);
			Call call=new Call("search.HelloService","echo",new Class[]{String.class},new Object[]{"hello"});
			System.out.println(call);
			oout.writeObject(call);
			ObjectInputStream oin=new ObjectInputStream(in);
			call=(Call)oin.readObject();
			System.out.println(call.getResult());
			oin.close();
			oout.close();
			socket.close();
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	public static void main(String[]args)
	{
		new SimpleClient().invoke();
	}
}


發佈了55 篇原創文章 · 獲贊 9 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章