梁飞 java_一个最最简易的RPC框架雏形---转载自梁飞的博客

1 packagecom.alibaba.study.rpc.framework;2

3 importjava.io.ObjectInputStream;4 importjava.io.ObjectOutputStream;5 importjava.lang.reflect.InvocationHandler;6 importjava.lang.reflect.Method;7 importjava.lang.reflect.Proxy;8 importjava.net.ServerSocket;9 importjava.net.Socket;10

11 /**

12 * RpcFramework13 *14 *@authorwilliam.liangf15 */

16 public classRpcFramework {17

18 /**

19 * 暴露服务20 *21 *@paramservice 服务实现22 *@paramport 服务端口23 *@throwsException24 */

25 public static void export(final Object service, int port) throwsException {26 if (service == null)27 throw new IllegalArgumentException("service instance == null");28 if (port <= 0 || port > 65535)29 throw new IllegalArgumentException("Invalid port " +port);30 System.out.println("Export service " + service.getClass().getName() + " on port " +port);31 ServerSocket server = newServerSocket(port);32 for(;;) {33 try{34 final Socket socket =server.accept();35 new Thread(newRunnable() {36 @Override37 public voidrun() {38 try{39 try{40 ObjectInputStream input = newObjectInputStream(socket.getInputStream());41 try{42 String methodName =input.readUTF();43 Class>[] parameterTypes = (Class>[])input.readObject();44 Object[] arguments =(Object[])input.readObject();45 ObjectOutputStream output = newObjectOutputStream(socket.getOutputStream());46 try{47 Method method =service.getClass().getMethod(methodName, parameterTypes);48 Object result =method.invoke(service, arguments);49 output.writeObject(result);50 } catch(Throwable t) {51 output.writeObject(t);52 } finally{53 output.close();54 }55 } finally{56 input.close();57 }58 } finally{59 socket.close();60 }61 } catch(Exception e) {62 e.printStackTrace();63 }64 }65 }).start();66 } catch(Exception e) {67 e.printStackTrace();68 }69 }70 }71

72 /**

73 * 引用服务74 *75 *@param 接口泛型76 *@paraminterfaceClass 接口类型77 *@paramhost 服务器主机名78 *@paramport 服务器端口79 *@return远程服务80 *@throwsException81 */

82 @SuppressWarnings("unchecked")83 public static T refer(final Class interfaceClass, final String host, final int port) throwsException {84 if (interfaceClass == null)85 throw new IllegalArgumentException("Interface class == null");86 if (!interfaceClass.isInterface())87 throw new IllegalArgumentException("The " + interfaceClass.getName() + " must be interface class!");88 if (host == null || host.length() == 0)89 throw new IllegalArgumentException("Host == null!");90 if (port <= 0 || port > 65535)91 throw new IllegalArgumentException("Invalid port " +port);92 System.out.println("Get remote service " + interfaceClass.getName() + " from server " + host + ":" +port);93 return (T) Proxy.newProxyInstance(interfaceClass.getClassLoader(), new Class>[] {interfaceClass}, newInvocationHandler() {94 public Object invoke(Object proxy, Method method, Object[] arguments) throwsThrowable {95 Socket socket = newSocket(host, port);96 try{97 ObjectOutputStream output = newObjectOutputStream(socket.getOutputStream());98 try{99 output.writeUTF(method.getName());100 output.writeObject(method.getParameterTypes());101 output.writeObject(arguments);102 ObjectInputStream input = newObjectInputStream(socket.getInputStream());103 try{104 Object result =input.readObject();105 if (result instanceofThrowable) {106 throw(Throwable) result;107 }108 returnresult;109 } finally{110 input.close();111 }112 } finally{113 output.close();114 }115 } finally{116 socket.close();117 }118 }119 });120 }121

122 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值