|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
JAVA学习必须明确这是一项投资,对于大多数的人来说,学习JAVA是为了就业,还有就是刚走向工作位置的朋友想尽快赶上工作的节奏。
服务器必需包括一个扩大了UnicastRemoteObject的类,并完成远程接口。这个类也能够含有附加的办法,但客户只能利用远程接口中的办法。这是明显的,由于客户失掉的只是指向接口的一个句柄,而非完成它的谁人类。
必需为远程对象明白界说构建器,即便只筹办界说一个默许构建器,用它挪用基本类构建器。必需把它明白地编写出来,由于它必需“掷”出RemoteException背例。
上面列出远程接口PerfectTime的实行历程:
- //:PerfectTime.java
- //TheimplementationofthePerfectTime
- //remoteobject
- packagec15.ptime;
- importjava.rmi.*;
- importjava.rmi.server.*;
- importjava.rmi.registry.*;
- importjava.net.*;
- publicclassPerfectTime
- extendsUnicastRemoteObject
- implementsPerfectTimeI{
- //Implementationoftheinterface:
- publiclonggetPerfectTime()
- throwsRemoteException{
- returnSystem.currentTimeMillis();
- }
- //Mustimplementconstructortothrow
- //RemoteException:
- publicPerfectTime()throwsRemoteException{
- //super();//Calledautomatically
- }
- //RegistrationforRMIserving:
- publicstaticvoidmain(String[]args){
- System.setSecurityManager(
- newRMISecurityManager());
- try{
- PerfectTimept=newPerfectTime();
- Naming.bind(
- "//colossus:2005/PerfectTime",pt);
- System.out.println("Readytodotime");
- }catch(Exceptione){
- e.printStackTrace();
- }
- }
- }///:~
复制代码
在这里,main()把持着设置服务器的全体细节。保留RMI对象时,必需在程序的某个中央接纳下述操纵:
(1)创立和安装一个平安办理器,令其撑持RMI。作为Java刊行包的一部分,合用于RMI独一一个是RMISecurityManager。
(2)创立远程对象的一个或多个实例。在这里,人人可看到创立的是PerfectTime对象。
(3)向RMI远程对象注册表注册最少一个远程对象。一个远程对象具有的办法可天生指向其他远程对象的句柄。如许一来,客户只需到注册内外会见一次,失掉第一个远程对象便可。
1.设置注册表
在这儿,人人可看到对静态办法Naming.bind()的一个挪用。但是,这个挪用请求注册表作为盘算机上的一个自力历程运转。注册表服务器的名字是rmiregistry。在32位Windows情况中,可以使用:
startrmiregistry
令其在背景运转。在Unix中,利用:
rmiregistry&
和很多收集程序一样,rmiregistry位于呆板启动它地点的某个IP地点处,但它也必需监督一个端口。假如象下面那样挪用rmiregistry,不利用参数,注册表的端口就会默许为1099。若但愿它位于其他某个端口,只需在命令行增加一个参数,指定谁人端口编号便可。对这个例子来讲,端口将位于2005,以是rmiregistry应当象上面如许启动(关于32位Windows):
startrmiregistry2005
关于Unix,则利用下述命令:
rmiregistry2005&
与端口有关的信息必需传送给bind()命令,同时传送的另有注册表地点的那台呆板的IP地点。但倘使我们想在当地测试RMI程序,就象本章的收集程序一向测试的那样,如许做就会带来成绩。在JDK1.1.1版本中,存在着下述两方面的成绩(正文⑦):
(1)localhost不克不及随RMI事情。以是为了在独自一台呆板上完成对RMI的测试,必需供应呆板的名字。为了在32位Windows情况中查询拜访本人呆板的名字,可进进把持面板,选择“收集”,选择“标识”卡片,个中列出了盘算机的名字。就我本人的情形来讲,我的呆板叫作“Colossus”(由于我用几个年夜容量的硬盘保留各类分歧的开辟体系——Clossus是“伟人”的意义)。仿佛年夜写情势会被疏忽。
(2)除非盘算机有一个举动的TCP/IP毗连,不然RMI不克不及事情,即便一切组件都只必要在当地呆板里相互通讯。这意味着在试图运转程序之前,必需毗连到本人的ISP(因特网服务供应者),不然会失掉一些寄义含混的背例动静。
⑦:为找出这些信息,我不知毁伤了几个脑细胞。
思索到这些要素,bind()命令酿成了上面这个模样:
Naming.bind("//colossus:2005/PerfectTime",pt);
若利用默许端口1099,就没有需要指定一个端口,以是可使用:
Naming.bind("//colossus/PerfectTime",pt);
在JDK将来的版本中(1.1以后),一旦更正了localhost的成绩,就可以一般地举行当地测试,往失落IP地点,只利用标识符:
Naming.bind("PerfectTime",pt);
服务名是恣意的;它在这里恰好为PerfectTime,和类名一样,但你能够依据情形恣意修正。最主要的是确保它在注册内外是个举世无双的名字,以便客户一般地猎取远程对象。若这个名字已在注册内外了,就会失掉一个AlreadyBoundException背例。为避免这个成绩,可思索保持利用rebind(),保持bind()。这是因为rebind()要末会增加一个新条目,要末将同名的条目交换失落。
只管main()加入,我们的对象已创立并注册,以是会由注册表一向坚持举动形态,期待客户抵达并收回对它的哀求。只需rmiregistry处于运转形态,并且我们没无为名字挪用Naming.unbind()办法,对象就一定位于谁人中央。思索到这个缘故原由,在我们计划本人的代码时,必要先封闭rmiregistry,并在编译远程对象的一个新版本时从头启动它。
其实不必定要将rmiregistry作为一个内部历程启动。若事前晓得本人的是请求用以注册表的独一一个使用,便可在程序外部启动它,利用下述代码:
LocateRegistry.createRegistry(2005);
和后面一样,2005代表我们在这个例子里选用的端标语。这等价于在命令行实行rmiregistry2005。但在计划RMI代码时,这类做法常常显得加倍便利,由于它作废了启动和中断注册表所需的分外步骤。一旦实行完这个代码,便可象之前一样利用Naming举行“绑定”——bind()。
在性能方面,在windows平台下,.net网页编程可能是占强项,要是把.net网页编程放在sun开发的操作系统上去运行呢?根本就运行不了,.net网页编程对其它操作系统的支持也很弱,性能也可能比不上java。 |
|