首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 互联网 >

socket 在远程方法调用中使用反射机制

2012-06-29 
socket 在远程方法调用中运用反射机制反射,客户端 服务器.接口 实现类 (传递的中间类) ??public interface

socket 在远程方法调用中运用反射机制

反射,客户端 服务器.

接口 实现类 (传递的中间类)

?

?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();
????????????????????????? }?
??????????????????}

热点排行