果然是课非蹭不能上也,大三下上了一周的课程了,反而觉得是蹭的课程最有实用性。

JNDI

概述

JNDI是啥,其实我并不知道。不过上了这一节课,大概知道了JNDI的一种用法,就是如何在服务器与客户端之间用JNDI传递对象。JNDI的组织形式大概是这样的:

Example
服务器与客户端通过JNDI交互的方式

按照陈老师所说的,服务器与客户端要想通过JNDI来交互,首先,服务器这边需要先向RMI Registry进行注册,代码来表述这个过程就是

ObjectA objectA = new ObjectA();
Context namingContext = new InitialContext();
namingContext.bind("rmi:objectA", objectA);

将一个对象跟一个字符串进行绑定,这样客户端如果想得到服务器段的这个对象,就可以向RMI Registry进行LookUp的操作,如果可以找到这个字符串,就意味着可以请求到字符串对应的对象。

找到这个对象之后,还存在一些问题,也就是图中Stub和Receiver起作用的地方,就是数据应该如何从服务器端传递到客户端。这里又涉及两种传输的方式,按值传递和按引用传递。

Stub & Receiver

先说说Stub和Receiver的作用吧,这两个东西感觉就是帮助我们写好了客户端与服务器端传输的细节,使得我们不需要自己设计实现。Stub是RMI Registry返回的,客户端可以当做没有他的存在。而实际上他的存在是负责把客户端的请求包装好,发送给Receiver,然后还有就是接收来自Receiver的Marshall过的数据,并把它Unmarshall以后返回。而Receiver是在服务器这边的,他负责接收客户端的请求,然后把返回数据Marshall后发给客户端的Stub。

值得注意的是,这两者之间的通信是传输二进制的,之前提到有两种,按值传递和按引用传递,这里是我上课的时候有点疑惑的地方。按值传递,要求客户端声明类implements Serializable,这个接口似乎是序列化的意思,他可以保证对象可以以序列化的方式传递,因此如果实现了这个接口,那么服务器的对象就会以值的方式传递给客户端。

如果想要按照引用传递,就要实现Remote接口,那么对象就会以远程引用的方式进行传递,按照老师的说法是得到一个类似引用的东西,会保证客户端对于对象的修改会使得服务器上的对象也得到修改,但是我有点不明白是如何做到的。

应用场景

JNDI可以实现进程之间的通信,因此如果客户端和服务器端是同一台机器上的两个进程,他们的通信可以用JNDI来做,其次就是距离不太远的通信,太远的话会有问题。另外还有问题就是JNDI实现比较复杂,当然我并没有写过,并不知道比较复杂是有多复杂。

Web Service

相比于JNDI,Web Service写起来要简单很多,看样例代码就可以发现这一点。感觉上Web Service跟JNDI结构是差不多的,都是客户端服务器这种结构。不同之处在于Web Service是用HTTP协议来很传递文本数据的,而不是像JNDI那样传递二进制。既然要传递文本协议,那肯定需要将对象按照一定规则转化为文本然后传递。Web Service就是转化为XML传递。而且,文本相比于二进制的好处是文本可以实现跨平台,文本数据是任何语言都可以读入的,所以只要文本数据按照一定的规则,服务器客户端都知道这个规则并且遵守,那么理论上服务器客户端不用统一平台,语言等等。另外HTTP可以支持更加远的数据传输。

课上Web Service讲的不多,听的也不多,就只能记住这些了。

总结

JNDI适合进程间,或者短距离的通信,效率比Web Service高,但是实现起来比较困难。Web Service实现简单,服务器客户端可以使用不同语言来实现,而且基于HTTP协议,基本不会受到物理距离的限制。

如有任何问题,敬请指正~

评论