远程接口的实施

服务器必须包含一个扩展了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调用远程接口、java远程接口调用方式、远程调用接口、netty远程调用接口,以便于您获取更多的相关知识。

时间: 2024-08-03 23:37:31

远程接口的实施的相关文章

远程接口概念

RMI对接口有着强烈的依赖.在需要创建一个远程对象的时候,我们通过传递一个接口来隐藏基层的实施细节.所以客户得到远程对象的一个句柄时,它们真正得到的是接口句柄.这个句柄正好同一些本地的根代码连接,由后者负责通过网络通信.但我们并不关心这些事情,只需通过自己的接口句柄发送消息即可. 创建一个远程接口时,必须遵守下列规则: (1) 远程接口必须为public属性(不能有"包访问":也就是说,它不能是"友好的").否则,一旦客户试图装载一个实现了远程接口的远程对象,就会得

灵活使用EJB的本地和远程接口(一)

引言 随着 EJB 2.0 规范的出现,Enterprise Java Bean 可以有本地接口.远程接口,或同时有两种接口,这给 J2EE 开发人员和架构师提供了非常大的灵活性.实现两种接口给予 Bean 客户端和 Bean 本身在开发场景方面的自由.取决于客户端与 EJB 的相对位置,可以设置访问 Bean 的逻辑的最佳方式.本地接口提供对 EJB 的优化访问(如果客户端和 Bean 位于同一 Java 虚拟机(Java Virtual Machine,JVM)中),而远程接口可以用于分布式

远程接口设计经验分享

远程接口设计经验分享 写在前边 分布式架构是互联网应用的基础架构,很多新人入职以来就开始负责编写和调用阿里的各种远程接口.但如同结婚一般,用对一个正确的接口就如同嫁一个正确的人一样,往往难以那么顺利的实现,或多或少大家都会在这个上边吃亏. 每年双十一系统调用复盘的时候,我都会听到以下声音 你们调我的接口报错了竟然不会自己重试? 我的返回值应该从这里取 我返回isSuccess() == true,不代表业务成功,你还需要判断ERROR_CODE 这个ERROR_CODE没说全部都要重试啊! 这个

Android系统进程间通信(IPC)机制Binder中的Client获得Server远程接口过程源代码分析_Android

     在上一篇文章中,我们分析了Android系统进程间通信机制Binder中的Server在启动过程使用Service Manager的addService接口把自己添加到Service Manager守护过程中接受管理.在这一篇文章中,我们将深入到Binder驱动程序源代码去分析Client是如何通过Service Manager的getService接口中来获得Server远程接口的.Client只有获得了Server的远程接口之后,才能进一步调用Server提供的服务.       

使用AIDL(Android接口描述语言)设计和使用远程接口

http://mintelong.iteye.com/blog/461862# 1 使用AIDL(AndRoid接口描述语言)设计和使用远程接口      1.1 使用AIDL实现IPC         1.1.1 创建一个AIDL文件         1.1.2 实现接口         1.1.3 向客户端公开接口         1.1.4 使用parcelables进行参数的值传递         1.2 调用一个IPC方法  使用AIDL(AndRoid接口描述语言)设计和使用远程接口

用asp做access的远程接口

 以前看到很多网友问,自己有两台服务器,如何这两台服务器上的mdb数据库数据的互访.今天作了个远程的接口,以xml形式返回mdb中的数据.用的主要思想是通过recordset对象的save方法将数据填充到一个xml dom里,但是,这种方法产生的XML不够简洁,自动产生的XML包含了schema信息,它描述这个XML里允许有什么节点和属性以及采用何种数据类型,而且数据节点也增加了名称空间.schema信息在需要数据验证的地方或进行更复杂的处理或许很有用,但是,大多数情况下,我们使用的是瘦客户机,

远程测试的实施方法探讨及实践

一.现有测试实施方式中可能遇到的问题 在实际应用系统测试中,我们经常遇到一些系统部署范围较大的案例:比如某行业产品数据管理系统,其数据的采集工作由各地市级的生产单位执行,数据采集完毕后经由地市级分子公司汇总并上传到省局级分公司,在由省局级分公司上传至国家局总部进行最终的汇总和统计,以供领导进行整体规划和决策.由于其结构特点,可以将系统由上至下划分为总中心系统.省局系统.地市级系统和生产单位业务系统四部分(有时地市级系统和生产单位业务系统合并,即为总中心.省局.地市三部分),各部分由对应级别的业务

如何通过对类的序列化实现WCF的远程接口调用?

问题描述 我建立的服务器端和用户端通过WCF实现接口调用,简单说来是传递一个自定义类对象,当然大家会想到序列化,我选用的是BinaryFormatter+MemoryStream,但不管是流类型传递还是转换为byte[]传递都会出现问题(如果各位大神对问题的种类感兴趣我可以给大家截图),我想请教大神们的是:1.基于BinaryFormatter应该选用什么流类型?2.除了Http传输以及Socket传输之外,用纯粹的WCF接口调用怎么远程传递一个自定义对象?IDE是VS2010,语言C#.下面是

灵活使用EJB的本地和远程接口(四)

部署不同的体系结构 服务器项目 创建一个名为"TestServerTomcat"的 Tomcat 服务器项目.在此项目内,选择 New Server and Server Configuration,输入"ServerTomcat"作为服务器名(Server name),并且在"Apache Tomcat version 4.1"下选择 Test Environment 作为服务器类型(Server type).在下一个面板中,指定 TOMCAT