下面就开始吧。
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(); } } }
在以上代码中有可以改进的方法:
文章来源: 动手实现一个简单的RPC框架