自实现RMI框架

关于代理机制和什么是RMI?

1.代理(Dynamic Proxy)
	代理分为静态代理和动态代理,其中静态代理就是通过接口,实现类,
	代理类来完成,全部是手动操作。动态代理可以在程序运行期间
	根据需要动态的创建代理类和实例,来完成实际的功能。
	
2.CGlib和JDK代理
	JDK代理用的较多使用的是接口来完成,CGlib是使用实现类来进行
	代理。具体代码如下:

JDK代理模式

	这里的前置拦截到后置拦截,就是我们实现rmi的地方的精髓。
	其中参数object就是实现类的对象

Cglib代理模式


总结:上述的两种方式都可以完成代理,代理机制是我们完成Rmi–短连接的重要手段(正如上述的前置拦截和后置拦截,我们就发送消息的前连接到服务器,接收消息后就断开)。其中运用最多的是JDK的代理模式,个人认为接口更安全,并且我们在客户端就不需要关心实现类了,只用产生一个接口,这个接口的名字(包名以及接口名)一定要相同,不然难定位到该执行的方法。

那什么是RMI呢?
即是远程方法调用,他是一种机制,能够让在某个JAVA虚拟机中的对象上的方法。可以用此方法调用的任何对象必须实现该远程接口。调用这样一个对象时,其参数为“marshalled”上。该方法终止时,将编组来自远程机的结构并将结果发送到调用方的虚拟机。如果方法调用导致抛出异常,则该异常将指示给调用方。

RMI的实现细节:

1.关于ip和port的设置,对于ip和port我们应该给出一个配置文件
来给用户自己配置,其中服务器需要设置ip,而客户端需要设置ip和port
,为了方便直接给一个接口,接口的两个方法是设置ip和port,对于
服务器的设置port就直接啥也不做就好。代码如下:

服务器和客户端都需要实现的接口
这是读取配置文件后去设置ip和port
客户端
服务器这里也是和客户端类似,这里就不贴代码了。不一样的地方就是服务器是不需要执行设置port的我们的setPort里面代码为空就好

2.因为我们要实现的是,客户端发送一个消息,这个消息是要服务器去执行某一个方法(当然会发关于执行方法的一堆参数),然后将返回值在发回客户端,这样就完成一次短连接。我们发现对于服务器而言定位到要执行的方法是困难的。但是客户端和服务器端都是拥有那个接口类的,所以我们只要先在服务器端将接口类方法和对应的实现类方法存起来,那么在执行方法的时候直接取就好了。

具体实现如下:
首先定义一个类来描述要执行的方法,首先要清楚执行方法需要什么。1.参数(通过客户端发送),2.方法(通过客户端发送的消息可以精确定位到)3.该方法所在的类的对象。所以我们在描述执行的方法时,直接将method和object作为成员。为什么要加object那是因为为了执行速度的加快,我们将其存在内存中要执行就直接取,不用在执行时还去new一个对象。
描述方法

对于对应,应该采用配置的方式,在一个XML文件中,接口类和实现类进行对应(这个还是应该用户来完成的)。然后完成接口类和实现类的每一个方法的一一对应关系,并将其存储好。
在这里插入图片描述
在这里插入图片描述
我认为在对接口类和实现类进行遍历方法前,应该先进行一个实现类和接口类的检验,检验该实现类是不是这个接口类的实现类。
isAssignableFrom这个方法可以检验。

3.这里的methodPool是用的接口类的方法的toString的hashCode为键,用这个方法去定位到实现类的方法并生成一个MethodDefinition并将其作为值存储在methodPool中,所以在客户端发送时,就发送要执行的方法(接口的方法)的toString后的哈希值,和执行该方法要的参数就好了。如下:

{
刚开始写作为初学者还是有点疑惑的,首先,传参怎么传,其次在app界面上只会存在输入id和password,要怎么在内部传参。

解答:1.关于实参在客户端怎么传输到服务器端,是写了一个解析工具,可以将其转换为字符串然后在解析回来。首先要考虑参数的复杂性,这样才会有普适性,所以解析工具一定要有一个typeTooken来获取类型这样才能在解析时解析成正确的形式(之所以用typeToken会因为一些泛型)
}
在这里插入图片描述

在这里插入图片描述
服务器收到发送的消息后,就将会在methodPool中去取对应的methodDefinition,然后获取后执行
在这里插入图片描述

工作原理

上述讲解完一些细节后需要知道原理,其实就是每一次的请求都会去连接服务器,在完成请求与响应后就断开连接。在客户端进行一次登录请求,将所有的参数经过工具封装,然后将对应接口的方法的hashCode发送过去,接着发送参数(利用argumentMaker进行疯封装,这里指的注意,获取代理类似反射机制是不会获取到参数名字的,只会形成arg0这种形式),经过两次发送后服务器会先在methodPool中通过hashCode去获取实现类的对应方法。在确定方法和对象后,在通过第二次参数(实参的字符串形式),利用方法里面参数的类型和参数名(自己构造,因为上面情况已经说明,只需要根据参数顺序来构造就好)。得到实参后对method的返回值进行返回。异常就报异常,为空就返回null,其他形式就根据返回值将方法执行得到的数据进行转换,然后进行argumentMaker封装,返回给客户端,并close()操作。客户端收到后会关闭通信信道,并将返回值进行判断和对数据进行操作就好 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值