Java实现一个简单的RPC框架(七) 反射机制调用类函数

来源:互联网 发布:坐标定位软件 编辑:程序博客网 时间:2024/05/17 21:58

ServiceRegister.java

import java.util.HashMap;import java.lang.reflect.*;/** * 通过register()去注册服务,通过get_service()去获取服务名对应的function * @author xchen * */public class ServiceRegister {int arg1;int arg2;HashMap<String, String> hm = new HashMap<>();void resigte(String servicename){if(hm.containsKey(servicename)){System.out.println("service is already exist!do have to resigter");}else{hm.put(servicename,servicename);}}public ServiceRegister(mRequest request) {this.arg1 = request.arg1;this.arg2 = request.arg2;}Services services = new Services(arg1, arg2);String getServicebyReflect(String callName) throws ClassNotFoundException{Object obj = null;Method method;Class[] classes = new Class[2];classes[0]= int.class;classes[1]= int.class;System.out.println("reflect start");System.out.println("callName:"+callName);Class<?> rClass = mServer.class;try {try {if(callName.equals("add")){method = rClass.getMethod("add",classes);System.out.println("call add");obj=method.invoke(rClass.newInstance(),arg1,arg2);}else{method = rClass.getMethod(callName);obj = method.invoke(rClass.newInstance());}System.out.println("reflect:"+method.invoke(rClass.newInstance()));} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException| InstantiationException e) {System.out.println("method.invoke err!");e.printStackTrace();}} catch (NoSuchMethodException e) {System.out.println("No such reflect method");e.printStackTrace();} catch (SecurityException e) {// TODO Auto-generated catch blocke.printStackTrace();}return obj.toString();}String getService(String callName){String functionN=hm.get(callName);return doMethod(functionN);}String doMethod(String functionN){if(functionN.equals("sayHello")){return services.sayHello();}if(functionN.equals("add")){return services.add();}return null;}}class Services{int id;int arg1;int arg2;public Services(int arg1,int arg2) {this.arg1=arg1;this.arg2=arg2;}String sayHello(){return "Hello";}String add(){return Integer.toString(arg1+arg2);}}


Client.java

import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.Socket;import java.net.UnknownHostException;public class Client {public static void main(String[] args) {mClient client = new mClient();client.setReqId(1);client.setReqCommand("add");client.setArg1(1);client.setArg2(2);String reqStr = client.req.getRequest();try {Socket socket = new Socket("localhost",12345);PrintWriter out = new PrintWriter(socket.getOutputStream());//将reqStr传给serverout.println(reqStr);out.flush();BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));//while(){String rspStr = in.readLine();System.out.println("response form Server:"+rspStr);client.rsp = client.decode(rspStr);System.out.println("decode result:"+client.rsp.result);}//BufferedReader in = new BufferedReader(in)//socket.close();} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}class mResponse{int id;String result;String getResponse(){return "id"+id+"result"+result;}}class mRequest{int id;String command;int arg1;int arg2;String getRequest(){return "req:id"+id+"command"+command+"arg1"+arg1+"arg2"+arg2;}}class mClient{mServer remote;mRequest req = new mRequest();String reqStr = req.getRequest();mResponse rsp = new mResponse();void setReqId(int id){req.id=id;}void setReqCommand(String command){req.command=command;}void setArg1(int arg1){req.arg1 = arg1;}void setArg2(int arg2){req.arg2 = arg2;}mClient(){remote = null;}String getRsp(String reqStr){String rspStr = remote.procRequest(reqStr);mResponse rsp=decode(rspStr);return rsp.result;}String sayHello(){req.id=1;req.command="sayHello";//req.getRequest()return getRsp(req.getRequest());}String add(int a,int b){req.id=1;req.command="add";req.arg1=a;req.arg2=b;return getRsp(req.getRequest());}mResponse decode(String rspStr){mResponse response = new mResponse();if(!rspStr.startsWith("rsp:")){System.out.println("it is not a response data");}else{response.id=Integer.parseInt(rspStr.substring(rspStr.indexOf("id")+2, rspStr.indexOf("result")));response.result=rspStr.substring(rspStr.indexOf("result")+6);}return response;}}

Server.java

import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.ServerSocket;import java.net.Socket;import javax.swing.JOptionPane;public class Server {//基于socket实现传输层public static void main(String[] args) {mServer server = new mServer();//server监听的端口号//port取值范围1-65535,这个server监听的端口号,一般指定较大的数值,这样可以和系统预留的端口号分开int port=12345;ServerSocket serverSocket = null;try {serverSocket = new ServerSocket(port);Socket socket = serverSocket.accept();//提示建立链接JOptionPane.showMessageDialog(null, "有客户端链接到本机的12345端口");BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));//while(true){String msgFromClient=in.readLine();System.out.println("Server print recived msg:"+msgFromClient);String reqStr = msgFromClient;String rspStr = server.procRequest(reqStr);PrintWriter out = new PrintWriter(socket.getOutputStream());out.println(rspStr);out.flush();}socket.close();} catch (IOException e) {e.printStackTrace();}}}/*class mResponse{int id;String result;String getResponse(){return "id"+id+"result"+result;}}class mRequest{int id;String command;int arg1;int arg2;String getRequest(){return "req:id"+id+"command"+command+"arg1"+arg1+"arg2"+arg2;}}*/class mServer{//Server解析收到的Request报文(报文由id和command组成)//将回复报文id设置为收到的报文一致//如果command为sayHello,那么范围的报文内容为Hello//如果为其他命令,我们暂时没有设定,所有输出无法解析提示消息unknown commandString procRequest(String reqStr){//return "Hello World";mRequest req =decode(reqStr);mResponse rsp = new mResponse();rsp.id = req.id;ServiceRegister register = new ServiceRegister(req);register.resigte(req.command);//tttry {System.out.println(register.getServicebyReflect(req.command));rsp.result = register.getServicebyReflect(req.command);} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}//tt//string equel method call function//rsp.result = register.getService(req.command);return encode(rsp);}//rspStr格式:rsp:id+@id+result+@resultString encode(mResponse response){String rspStr;rspStr="rsp:id"+response.id+"result"+response.result;return rspStr;}//reqStr格式:req:id+@id+command+@command+arg1+@arg1+arg2+@arg2mRequest decode(String reqStr){//System.out.println("serverdecode reqStr:"+reqStr);mRequest request = new mRequest();if(!reqStr.startsWith("req:")){System.err.println("it is not a request data");}else{request.id=Integer.parseInt(reqStr.substring(reqStr.indexOf("id")+2,reqStr.indexOf("command")));request.command=reqStr.substring(reqStr.indexOf("command")+7, reqStr.indexOf("arg1"));//System.out.println("server decode command:"+request.command);request.arg1=Integer.parseInt(reqStr.substring(reqStr.indexOf("arg1")+4, reqStr.indexOf("arg2")));request.arg2=Integer.parseInt(reqStr.substring(reqStr.indexOf("arg2")+4));}return request;}//functionspublic String sayHello(){return "Hello";}public String add(int arg1,int arg2){return Integer.toString(arg1+arg2);//return Integer.toString(arg1+arg2);}}


0 0
原创粉丝点击