日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JAVA反射+SOCKET实现远程方法调用

發布時間:2025/3/20 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JAVA反射+SOCKET实现远程方法调用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

實現類共有5個:

com/chenun/javanet/rmi/RemoteCall.java??

?//RemoteCall類代表一次遠程call的對象的抽象
com/chenun/javanet/rmi/RemoteServer.java//遠程方法調用服務器端
com/chenun/javanet/rmi/CallClient.java//遠程方法調用客戶端
com/chenun/javanet/rmi/HelloService.java//接口類
com/chenun/javanet/rmi/HelloServiceImpl.java//實現類

?

RemoteCall.java?

package com.chenun.javanet.rmi;import java.io.Serializable; import java.util.Arrays;/*** 一個RemoteCall對象表示一個客戶端向一個服務端發起的一次遠程調用* @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; // 參數類型private Object[] params; // 參數列表private Object result = null; // 方法執行結果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 {//這個map存儲className對應的Interface和實現類的對應關系private Map<String,Object> remoteObjectMap = new HashMap<String,Object>(); //存放遠程對象的緩存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("服務器端啟動完畢...");while(true){Socket socket = serverSocket.accept();//輸入相關流InputStream inputStream = socket.getInputStream();ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);//輸出相關流 OutputStream outputStream = socket.getOutputStream();ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);//接收remoteCall對象流RemoteCall remoteCall = (RemoteCall)objectInputStream.readObject();System.out.println(remoteCall.toString());remoteCall = this.invoke(remoteCall);//返回給遠程客戶端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會執行該類的靜態代碼段*/Class<?> classType = Class.forName(className);Method method = classType.getMethod(methodName, paramTypes);Object remoteObject = remoteObjectMap.get(className);if(remoteObject == null){throw new ClassNotFoundException(className+"的遠程對象不存在 ! ");}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();//把事先創建好的HelloServiceImpl加入到服務器緩存中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();}}} }

?

最后是接口+實現類:

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一下 ?:

?

轉載于:https://my.oschina.net/u/2338224/blog/968150

總結

以上是生活随笔為你收集整理的JAVA反射+SOCKET实现远程方法调用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。