整体通信过程如下图:
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();
}
}