动手实现一个简单的RPC框架

匿名 (未验证) 提交于 2019-12-03 00:21:02







下面就开始吧。


package Caller;  public interface ProductService {     public Product queryById(long id); }


package Caller;  import java.io.Serializable;  public class Product implements Serializable {     private long id;     private String name;     private double price;     /**      * get/set方法      **/     @Override     public String toString() {         return "Product{" +                 "id=" + id +                 ", name='" + name + '\'' +                 ", price=" + price +                 '}';     } }


public class ProductCaller {     public static void main(String[] args) {         ProductService service = (ProductService) rpc(ProductService.class);         Product product = service.queryById(100);         System.out.println(product);     }     private static Object rpc(Class<?> clazz) {         return Proxy.newProxyInstance(clazz.getClassLoader(), new Class[]{clazz}, new InvocationHandler() {             @Override             public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {                 ObjectOutputStream oos = null;                 ObjectInputStream ois = null;                 Socket socket = null;                 try {                     socket = new Socket("localhost",8777);                     oos = new ObjectOutputStream(socket.getOutputStream());                     //发送调用方法的一些属性                     oos.writeUTF(clazz.getName());                     oos.writeUTF(method.getName());                     oos.writeObject(method.getParameterTypes());                     oos.writeObject(args);                     //等待服务端的结果                     ois = new ObjectInputStream(socket.getInputStream());                     return ois.readObject();                 }finally {                     if (oos!=null){                         try {                             oos.close();                         }catch (Exception e){                             e.printStackTrace();                         }                     }                     if (ois!=null){                         try {                             ois.close();                         }catch (Exception e){                             e.printStackTrace();                         }                     }                     if (socket!=null){                         try {                             socket.close();                         }catch (Exception e){                             e.printStackTrace();                         }                     }                 }             }         });     } }


public class ProductServiceImpl implements ProductService{     @Override     public Product queryById(long id) {         Product product = new Product();         product.setId(id);         product.setName("张三");         product.setPrice(1.0);         return product;     } }

public class ProductServer {     private static final Map<String,Class<?>> map = new HashMap<>();     static {         map.put("Caller.ProductService",ProductServiceImpl.class);     }     public static void main(String[] args) {         try {             ServerSocket serverSocket = new ServerSocket(8777);             Socket socket = serverSocket.accept();             //读取信息             ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());             String ClassName = ois.readUTF();             String methodName = ois.readUTF();             Class[] paramterTypes = (Class[]) ois.readObject();             Object[] paramters = (Object[]) ois.readObject();             Class<?> clazz = map.get(ClassName);             if (clazz==null)                 throw new Exception("not found "+ClassName);             Method method = clazz.getMethod(methodName,paramterTypes);             Object result = method.invoke(clazz.newInstance(), paramters);             ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());             oos.writeObject(result);             oos.close();             ois.close();             socket.close();         } catch (Exception e) {             e.printStackTrace();         }     } }




在以上代码中有可以改进的方法:


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!