跳转到主内容
websoft网络软件专家 - 深耕网络技术,打造实用软件!

java编程思想电子书下载,Java实现RPC(源码)(1)

动态代理模块封装 package com.ruider.Invoker; /** 动态代理工厂,对相应的class生产其对应代理类 */ import com.ruider.common.ServiceInformation; import com.ruider.networkCommunication.BIOService; import com.ruider.networkCommunication.NetIO; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class InvokerUtils implements InvocationHandler { /** 调用服务类 */ private Class clazz; /** 调用服务管理 */ private ServiceInformation serviceInformation; /** 获取代理对象 @param T @param url @param port @return */ public Object getBean (Class T, String url, int port) { this.clazz = T; ServiceInformation serviceInformation = new ServiceInformation(); serviceInformation.setServiceURL(url); serviceInformation.setPort(port); serviceInformation.setClassName(T.getName()); this.serviceInformation = serviceInformation; return Proxy.newProxyInstance(T.getClassLoader(), new Class[]{T}, this); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { NetIO BIO = new BIOService(); this.serviceInformation.setMethod(method); this.serviceInformation.setArgs(args); return BIO.send(serviceInformation); } } 网络传输模块封装 package com.ruider.networkCommunication; import com.ruider.common.ServiceInformation; /** BIO服务 */ public interface NetIO { /** 客户端发送请求到其他服务端 @param serviceInformation @return */ Object send (ServiceInformation serviceInformation); /** 本机作为服务端接受请求并且处理请求 @param port */ void recv (int port); } package com.ruider.networkCommunication; import com.ruider.common.ServiceInformation; import com.ruider.common.UserApi; import com.ruider.server.UserService; 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; /** 使用BIO通信 */ public class BIOService implements NetIO { /** 主机IP */ private String url; /** 端口 */ private int port; /** 客户端socket */ private Socket clientSocket; /** 服务端socket */ private ServerSocket serverSocket; public BIOService() {} public BIOService(String url, int port) { this.url = url; this.port = port; } /** 客户端采用BIO通信方式发送请求信息 @param serviceInformation @return */ @Override public Object send(ServiceInformation serviceInformation) { ObjectOutputStream objectOutputStream = null; ObjectInputStream objectInputStream = null; try { this.clientSocket = new Socket(serviceInformation.getServiceURL(), serviceInformation.getPort()); String className = serviceInformation.getClassName(); String methodName = serviceInformation.getMethod().getName(); Class[] parameterTypes = serviceInformation.getMethod().getParameterTypes(); Object[] args = serviceInformation.getArgs(); objectOutputStream = new ObjectOutputStream(this.clientSocket.getOutputStream()); objectOutputStream.writeUTF(className); objectOutputStream.writeUTF(methodName); objectOutputStream.writeObject(parameterTypes); objectOutputStream.writeObject(args); objectInputStream = new ObjectInputStream(this.clientSocket.getInputStream()); Object o = objectInputStream.readObject(); System.out.println("Object = " + o); return o; } catch (Exception e) { if (this.clientSocket != null) { try { this.clientSocket.close(); }catch (IOException e1) { e1.printStackTrace(); } } if (objectOutputStream != null) { try { objectOutputStream.close(); }catch (IOException e1) { e1.printStackTrace(); } } if (objectInputStream != null) { try { objectInputStream.close(); }catch (IOException e1) { e1.printStackTrace(); } } return null; } finally { if (this.clientSocket != null) { try { this.clientSocket.close(); }catch (IOException e1) { e1.printStackTrace(); } } if (objectOutputStream != null) { try { objectOutputStream.close(); }catch (IOException e1) { e1.printStackTrace(); } } if (objectInputStream != null) { try { objectInputStream.close(); }catch (IOException e1) { e1.printStackTrace(); } } } } /** 服务端采用BIO通信获取数据 @return */ @Override public void recv (int port) { ObjectInputStream objectInputStream = null; ObjectOutputStream objectOutputStream = null; try { this.serverSocket = new ServerSocket(port); System.out.println(“启动远程服务监听…”); //监听客户端发来消息 while (true){ Socket socket = serverSocket.accept(); objectInputStream = new ObjectInputStream(socket.getInputStream()); //客户端传输类名 String className = objectInputStream.readUTF(); String methodName = objectInputStream.readUTF(); Class[] parameterTypes = (Class[])objectInputStream.readObject(); Object[] arguments = (Object[]) objectInputStream.readObject(); Class clazz = null; //服务匹配 if(className.equals(UserApi.class.getName())){ clazz = UserService.class; } //clazz = UserService.class; Method method = clazz.getMethod(methodName,parameterTypes); Object result = method.invoke(clazz.newInstance(),arguments); objectOutputStream = new ObjectOutputStream(socket.getOutputStream()); objectOutputStream.writeObject(result); objectOutputStream.flush(); socket.close(); } } catch (Exception e) { try { if (objectOutputStream != null) { objectOutputStream.close(); } if (objectInputStream != null) { objectInputStream.close(); } if (this.serverSocket != null) { this.serverSocket.close(); } } catch (IOException e1) { e1.printStackTrace(); } e.printStackTrace(); } finally { try { if (objectOutputStream != null) { objectOutputStream.close(); } if (objectInputStream != null) { objectInputStream.close(); } if (this.serverSocket != null) { this.serverSocket.close(); } } catch (IOException e1) { e1.printStackTrace(); } } } } 调用服务API接口 package com.ruider.common; /** RPC服务调用公用接口API */ public interface UserApi { User getUser(Integer id); } 调用服务信息管理类 package com.ruider.common; /** 被调用服务信息 */ import java.io.Serializable; import java.lang.reflect.Method; public class ServiceInformation implements Serializable { /** 被调用服务的主机ip */ private String serviceURL; /** 自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。

自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!

(备注Java获取)

总结 就写到这了,也算是给这段时间的面试做一个总结,查漏补缺,祝自己好运吧,也希望正在求职或者打算跳槽的 程序员看到这个文章能有一点点帮助或收获,我就心满意足了。

多思考,多问为什么。

希望小伙伴们早点收到满意的offer! 越努力越幸运!

金九银十已经过了,就目前国内的面试模式来讲,在面试前积极的准备面试,复习整个 Java 知识体系将变得非常重要,可以很负责任的说一句,复习准备的是否充分,将直接影响你入职的成功率。

但很多小伙伴却苦于没有合适的资料来回顾整个 Java 知识体系,或者有的小伙伴可能都不知道该从哪里开始复习。

我偶然得到一份整理的资料,不论是从整个 Java 知识体系,还是从面试的角度来看,都是一份含技术量很高的资料。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

如果你觉得这些内容对你有帮助,可以扫码获取!

(备注Java获取)

总结 就写到这了,也算是给这段时间的面试做一个总结,查漏补缺,祝自己好运吧,也希望正在求职或者打算跳槽的 程序员看到这个文章能有一点点帮助或收获,我就心满意足了。

多思考,多问为什么。

希望小伙伴们早点收到满意的offer! 越努力越幸运!

金九银十已经过了,就目前国内的面试模式来讲,在面试前积极的准备面试,复习整个 Java 知识体系将变得非常重要,可以很负责任的说一句,复习准备的是否充分,将直接影响你入职的成功率。

但很多小伙伴却苦于没有合适的资料来回顾整个 Java 知识体系,或者有的小伙伴可能都不知道该从哪里开始复习。

我偶然得到一份整理的资料,不论是从整个 Java 知识体系,还是从面试的角度来看,都是一份含技术量很高的资料。

[外链图片转存中…(img-FhmOBqMC-1713454130489)] 《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

相关文章