日期:2011-03-22 16:16:00 来源:本站整理
远程接口的实施[Java编程]
本文“远程接口的实施[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
服务器必须包含一个扩大了UnicastRemoteObject的类,并实现远程接口.这个类也可以含有附加的办法,但客户只能利用远程接口中的办法.这是明显的,因为客户得到的只是指向接口的一个句柄,而非实现它的那个类.
必须为远程对象明肯定义构建器,即便只预备定义一个默许构建器,用它调用底子类构建器.必须把它明确地编写出来,因为它必须“掷”出RemoteException违例.
下面列出远程接口PerfectTime的实施历程:
//: PerfectTime.java // The implementation of the PerfectTime // remote object package c15.ptime; import java.rmi.*; import java.rmi.server.*; import java.rmi.registry.*; import java.net.*; public class PerfectTime extends UnicastRemoteObject implements PerfectTimeI { // Implementation of the interface: public long getPerfectTime() throws RemoteException { return System.currentTimeMillis(); } // Must implement constructor to throw // RemoteException: public PerfectTime() throws RemoteException { // super(); // Called automatically } // Registration for RMI serving: public static void main(String[] args) { System.setSecurityManager( new RMISecurityManager()); try { PerfectTime pt = new PerfectTime(); Naming.bind( "//colossus:2005/PerfectTime", pt); System.out.println("Ready to do time"); } catch(Exception e) { e.printStackTrace(); } } } ///:~
在这里,main()掌握着设置服务器的全部细节.保存RMI对象时,必须在程序的某个地方采纳下述操作:
(1) 成立和安装一个安全管理器,令其支持RMI.作为Java发行包的一部份,实用于RMI唯一一个是RMISecurityManager.
(2) 成立远程对象的一个或多个实例.在这里,大家可看到成立的是PerfectTime对象.
(3) 向RMI远程对象注册表注册至少一个远程对象.一个远程对象拥有的办法可生成指向其他远程对象的句柄.这样一来,客户只需到注册表里拜候一次,得到第一个远程对象便可.
1. 设置注册表
在这儿,大家可看到对静态办法Naming.bind()的一个调用.但是,这个调用要求注册表作为计算机上的一个独立进程运行.注册表服务器的名字是rmiregistry.在32位Windows环境中,可以利用:
start rmiregistry
令其在后台运行.在Unix中,利用:
rmiregistry &
和很多网络程序一样,rmiregistry位于机械启动它所在的某个IP地址处,但它也必须监督一个端口.假如象上面那样调用rmiregistry,不利用参数,注册表的端口就会默许为1099.若但愿它位于其他某个端口,只需在号令行增添一个参数,指定那个端口编号便可.对这个例子来说,端口将位于2005,所以rmiregistry应当象下面这样启动(关于32位Windows):
start rmiregistry 2005
关于Unix,则利用下述号令:
rmiregistry 2005 &
与端口有关的信息必须传送给bind()号令,同时传送的还有注册表所在的那台机械的IP地址.但假如我们想在本地测试RMI程序,就象本章的网络程序一向测试的那样,这样做就会带来问题.在JDK 1.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代表我们在这个例子里选用的端口号.这等价于在号令行履行rmiregistry 2005.但在计划RMI代码时,这种做法常常显得越发便利,因为它撤消了启动和中止注册表所需的额外步骤.一旦履行完这个代码,便可象从前一样利用Naming举行“绑定”——bind().
以上是“远程接口的实施[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
- ·上一篇文章:成立根与干
- ·下一篇文章:observer情势
- ·中查找“远程接口的实施”更多相关内容
- ·中查找“远程接口的实施”更多相关内容
评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论