自己实现简单的RPC

来源:互联网 发布:产品数据管理软件 编辑:程序博客网 时间:2024/05/22 06:17

1.server

package com.xiaogang.server;public interface IService {      public String service(String str);      }  

package com.xiaogang.server;public class ServiceImpl implements IService{        @Override      public String service(String str) {                 return "ServiceWrappered["+str+"]"+System.currentTimeMillis();                 }    }  

package com.xiaogang.server;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.lang.reflect.Method;import java.net.ServerSocket;import java.net.Socket;import java.util.Arrays;public class ServiceProvider {            public static void main(String[] args) {          ServerSocket server =  null;          ObjectOutputStream out = null;          try {              server = new ServerSocket(8080);              Socket socket =null;                          int numAccept=0;                          while(numAccept<5){                  System.out.println("--------------Service started---------------");                  socket = server.accept();                  numAccept++;                ObjectInputStream input = new ObjectInputStream(socket.getInputStream());                  String interfaceName = input.readUTF(); //接口名称                  String methodName = input.readUTF(); //方法名称                  Class<?>[] parameterType = (Class<?>[]) input.readObject(); //方法类型                  Object[] arguments = (Object[]) input.readObject();    //参数列表                  System.out.println("server接收到的参数:"+Arrays.toString(arguments));                                    //根据接口名称获取class                  Class<?> serviceInterfaceClass = Class.forName(interfaceName);                  //根据方法名称和参数类型反射得到方法                  Method method = serviceInterfaceClass.getMethod(methodName, parameterType);                  //服务实例化(这里做简单处理,正常应该根据得到的接口名称serviceInterfaceClass获取对应的service,但本demo只提供一个服务)                  IService service = new ServiceImpl();                                    //反射执行这个方法                  Object result = method.invoke(service, arguments);                                    //写会处理结果                  out = new ObjectOutputStream(socket.getOutputStream());                  out.writeObject(result);                                                  }              System.out.println("--------------Service stoped---------------");         } catch (Exception e) {              e.printStackTrace();          }finally{              try {                  out.close();              } catch (IOException e1) {                  e1.printStackTrace();              }              if(server!=null){                  try {                      server.close();                  } catch (IOException e) {                      e.printStackTrace();                  }                  server = null;              }          }      }  }  


2.client

package com.xiaogang.client;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.lang.reflect.Method;import java.net.Socket;import com.xiaogang.server.IService;public class ClientCaller {      public static void main(String[] args) {          try {              //接口名称              String interfaceName = IService.class.getName();              //接口方法              Method method = IService.class.getMethod("service", java.lang.String.class);              //参数              Object[] arguments = {"hello"};                            Socket socket = new Socket("10.40.30.200",8080);                            //发送请求              ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());              out.writeUTF(interfaceName);              out.writeUTF(method.getName());              out.writeObject(method.getParameterTypes());              out.writeObject(arguments);                            //获取结果              ObjectInputStream inputStream = new ObjectInputStream(socket.getInputStream());              Object returnObject = inputStream.readObject();              System.out.println("client recieve: "+returnObject.toString());                        } catch (Exception e) {              e.printStackTrace();          }                }  }  





原创粉丝点击