JAVA反射+SOCKET实现远程方法调用
生活随笔
收集整理的這篇文章主要介紹了
JAVA反射+SOCKET实现远程方法调用
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
實(shí)現(xiàn)類共有5個(gè):
| com/chenun/javanet/rmi/RemoteCall.java?? | ?//RemoteCall類代表一次遠(yuǎn)程call的對(duì)象的抽象 |
| com/chenun/javanet/rmi/RemoteServer.java | //遠(yuǎn)程方法調(diào)用服務(wù)器端 |
| com/chenun/javanet/rmi/CallClient.java | //遠(yuǎn)程方法調(diào)用客戶端 |
| com/chenun/javanet/rmi/HelloService.java | //接口類 |
| com/chenun/javanet/rmi/HelloServiceImpl.java | //實(shí)現(xiàn)類 |
?
RemoteCall.java?
package com.chenun.javanet.rmi;import java.io.Serializable; import java.util.Arrays;/*** 一個(gè)RemoteCall對(duì)象表示一個(gè)客戶端向一個(gè)服務(wù)端發(fā)起的一次遠(yuǎn)程調(diào)用* @author Administrator*2017年6月14日16:36:05*/ public class RemoteCall implements Serializable {/*** serialVersionUID*/private static final long serialVersionUID = -8214916480546311060L;private String className; // 類名private String methodName; // 方法名private Class<?>[] paramTypes; // 參數(shù)類型private Object[] params; // 參數(shù)列表private Object result = null; // 方法執(zhí)行結(jié)果public RemoteCall(){}public RemoteCall(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;}@Overridepublic String toString(){return "RemoteCall [className=" + className + ", methodName=" + methodName + ", paramTypes=" + Arrays.toString(paramTypes)+ ", params=" + Arrays.toString(params) + ", result=" + result + "]";} }RemoteServer.java
package com.chenun.javanet.rmi;import java.io.Closeable; import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.OutputStream; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.net.ServerSocket; import java.net.Socket; import java.util.HashMap; import java.util.Map;public class RemoteServer {//這個(gè)map存儲(chǔ)className對(duì)應(yīng)的Interface和實(shí)現(xiàn)類的對(duì)應(yīng)關(guān)系private Map<String,Object> remoteObjectMap = new HashMap<String,Object>(); //存放遠(yuǎn)程對(duì)象的緩存private void register(String className,Object remoteObject){remoteObjectMap.put(className, remoteObject);}public void service() throws IOException, ClassNotFoundException{@SuppressWarnings("resource")ServerSocket serverSocket = new ServerSocket(8008, 100);System.out.println("服務(wù)器端啟動(dòng)完畢...");while(true){Socket socket = serverSocket.accept();//輸入相關(guān)流InputStream inputStream = socket.getInputStream();ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);//輸出相關(guān)流 OutputStream outputStream = socket.getOutputStream();ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);//接收remoteCall對(duì)象流RemoteCall remoteCall = (RemoteCall)objectInputStream.readObject();System.out.println(remoteCall.toString());remoteCall = this.invoke(remoteCall);//返回給遠(yuǎn)程客戶端objectOutputStream.writeObject(remoteCall);this.release(inputStream);this.release(outputStream);this.release(socket);}}private RemoteCall invoke(RemoteCall remoteCall){Object result = null;try{String className = remoteCall.getClassName();String methodName = remoteCall.getMethodName();Object[] params = remoteCall.getParams();Class<?>[] paramTypes = remoteCall.getParamTypes();/*** Class.forName(xxx.xx.xx)的作用是要求JVM查找并加載指定的類,* 也就是說JVM會(huì)執(zhí)行該類的靜態(tài)代碼段*/Class<?> classType = Class.forName(className);Method method = classType.getMethod(methodName, paramTypes);Object remoteObject = remoteObjectMap.get(className);if(remoteObject == null){throw new ClassNotFoundException(className+"的遠(yuǎn)程對(duì)象不存在 ! ");}else{result = method.invoke(remoteObject, params);}}catch(ClassNotFoundException e){result = e;e.printStackTrace();}catch (NoSuchMethodException e){result = e;e.printStackTrace();}catch (SecurityException e){result = e;e.printStackTrace();}catch (IllegalAccessException e){result = e;e.printStackTrace();}catch (IllegalArgumentException e){result = e;e.printStackTrace();}catch (InvocationTargetException e){result = e;e.printStackTrace();}catch(Exception e){result = e;e.printStackTrace();}remoteCall.setResult(result);return remoteCall;}private <T extends Closeable> void release(T t){if(t != null){try{t.close();}catch (IOException e){e.printStackTrace();}}}public static void main(String[] args){RemoteServer remoteServer = new RemoteServer();//把事先創(chuàng)建好的HelloServiceImpl加入到服務(wù)器緩存中remoteServer.register("com.chenun.javanet.rmi.HelloService", new HelloServiceImpl());try{remoteServer.service();}catch (ClassNotFoundException e){e.printStackTrace();}catch (IOException e){e.printStackTrace();}} }CallClient.java
package com.chenun.javanet.rmi;import java.io.Closeable; 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 CallClient {public void invoke() throws UnknownHostException, IOException, ClassNotFoundException{Socket socket = new Socket("localhost", 8008);OutputStream outputStream = socket.getOutputStream();ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);InputStream inputStream = socket.getInputStream();ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);//RemoteCall remoteCall = new RemoteCall("remotecall.HelloService", "getTime", new Class<?>[] {}, new Object[] { "test" });RemoteCall remoteCall = new RemoteCall("com.chenun.javanet.rmi.HelloService", "echo", new Class<?>[] { String.class }, new Object[] { "test" });objectOutputStream.writeObject(remoteCall);RemoteCall call = (RemoteCall)objectInputStream.readObject();System.out.println("call.getResult() = " + call.getResult());this.release(outputStream);this.release(inputStream);this.release(socket);}public static void main(String[] args) {CallClient callClient = new CallClient();try{callClient.invoke();}catch (UnknownHostException e){e.printStackTrace();}catch (ClassNotFoundException e){e.printStackTrace();}catch (IOException e){e.printStackTrace();}}public <T extends Closeable> void release(T t){if(t != null){try{t.close();}catch (IOException e){e.printStackTrace();}}} }?
最后是接口+實(shí)現(xiàn)類:
HelloService.JAVA
package com.chenun.javanet.rmi;import java.util.Date;public interface HelloService {String echo(String msg);Date getTime(); }HelloServiceImpl.JAVA
package com.chenun.javanet.rmi;import java.util.Date;public class HelloServiceImpl implements HelloService {@Overridepublic String echo(String msg){return "echo : "+msg;}@Overridepublic Date getTime(){return new Date();} }RUN一下 ?:
?
轉(zhuǎn)載于:https://my.oschina.net/u/2338224/blog/968150
總結(jié)
以上是生活随笔為你收集整理的JAVA反射+SOCKET实现远程方法调用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ORA-20000:ORU-10027:
- 下一篇: 【Android个人理解(八)】跨应用调