Java网络编程精解讲义16.ppt
Java网络编程精解作者:孙卫琴作者:孙卫琴作者:孙卫琴作者:孙卫琴参考书籍:参考书籍:参考书籍:参考书籍:技术支持网址:技术支持网址:技术支持网址:技术支持网址:www.javathinker.orgwww.javathinker.org第16章 CORBA简介参考Java网络编程精解的第16章n16.1 创建IDL接口n16.2 创建IDL接口的实现类n16.3 创建服务器程序n16.4 创建客户程序n16.5 运行CORBA程序 第16章 CORBA简介nCORBA(Common Object Request Broker Architecture,公用对象请求代理体系结构)是一种分布式的软件体系结构。nCORBA独立于任何编程语言,并且独立于任何操作系统平台。这意味着在Linux中用Java语言编写的CORBA对象可以与Windows操作系统中用C+语言编写的CORBA对象通信。这里的CORBA对象是指符合CORBA规范的远程对象。第16章 CORBA简介nCORBA也采用客户/服务器模式。nORB(Object Request Broker,对象请求代理)充当连接客户与服务器之间的中间件。n不同的ORB之间通过IIOP协议(Internet Inter-ORB Protocol,网络ORB交换协议)通信,IIOP建立在TCP/IP协议的基础上。第16章 CORBA简介第16章 CORBA简介nCORBA要保证用不同编程语言编写的客户与服务器能够通信,为了使双方能“看得懂”对方的接口,CORBA采用专门的IDL(Interface Definition Language)语言来定义接口。nIDL语言独立于任何其他编程语言。第16章 CORBA简介n创建CORBA程序包括以下步骤:n(1)用IDL语言定义CORBA对象的接口,在接口中声明可以被远程调用的方法。n(2)使用针对目标语言的IDL编译器,编译由步骤一创建的IDL接口,生成用目标语n言编写的存根类以及其他辅助类的源文件。这里的目标语言可以是Java或C+等编程语言。n(3)用目标语言编写实现IDL接口的类。n(4)编写一个服务器程序,它创建并注册CORBA对象。n(5)编写一个客户程序,它获得CORBA对象的远程引用,然后调用其方法。第16章 CORBA简介n下面介绍一个用Java语言来实现的简单的CORBA例子。本例子需要创建以下源文件:nHelloService.idl文件:IDL接口。nHelloServiceImpl.java文件:实现IDL接口的Java类。nHelloServer.java文件:服务器程序。nHelloClient.java文件:客户程序。16.1 创建IDL接口n例程16-1是HelloService.idl的源代码,它用IDL语言编写。例程16-1 HelloService.idlmodule hello interface HelloService string sayHello();oneway void shutdown();16.2 创建IDL接口的实现类n例程16-2的HelloServiceImpl类实现了HelloService接口。它继承自HelloServicePOA类。HelloServicePOA类由IDL编译器自动生成。例程16-2 HelloServiceImpl.javapublic class HelloServiceImpl extends HelloServicePOA private ORB orb;public void setORB(ORB orb_val)orb=orb_val;public String sayHello()return nHello world!n;public void shutdown()orb.shutdown(false);16.3 创建服务器程序n例程16-3的HelloServer类创建了一个HelloServiceImpl对象,把它注册到命名服务器中,被绑定的名字为“HelloService”。nJDK提供了一个CORBA的命名服务器程序,即JDK的安装目录的bin子目录下的orbd.exe程序。例程16-3 HelloServer.java1.public class HelloServer 2.public static void main(String args)3.try4./创建和初始化ORB5.ORB orb=ORB.init(args,null);6./获得根POA的引用,并且激活POAManager7.POA rootpoa=POAHelper.narrow(orb.resolve_initial_references(RootPOA);8.rootpoa.the_POAManager().activate();9./创建一个HelloServiceImpl对象,并且把它与ORB关联10.HelloServiceImpl helloServiceImpl=new HelloServiceImpl();11.helloServiceImpl.setORB(orb);16.3 创建服务器程序12./获得HelloServiceImpl对象的CORBA类型的对象引用13.org.omg.CORBA.Object ref=rootpoa.servant_to_reference(helloServiceImpl);14.HelloService href=HelloServiceHelper.narrow(ref);15.16./获得代表命名服务的Context17.org.omg.CORBA.Object objRef=18.orb.resolve_initial_references(NameService);19.NamingContextExt ncRef=NamingContextExtHelper.narrow(objRef);20./把HelloService对象与“HelloService”名字绑定21.String name=HelloService;22.NameComponent path=ncRef.to_name(name);23.ncRef.rebind(path,href);24.System.out.println(HelloServer ready and waiting.);25.orb.run();/等待客户端访问HelloService对象26.catch(Exception e).27.System.out.println(HelloServer Exiting.);28.29.16.4 创建客户程序n例程16-4的HelloClient类获得远程HelloService对象的引用,然后调用它的sayHello()和shutdown()方法。例程16-4 HelloClient.javapublic class HelloClient static HelloService helloServiceImpl;public static void main(String args)try ORB orb=ORB.init(args,null);/创建和初始化ORB /获得代表命名服务的Context org.omg.CORBA.Object objRef=orb.resolve_initial_references(NameService);NamingContextExt ncRef=NamingContextExtHelper.narrow(objRef);/获得名为“HelloService”的HelloService对象的远程引用 String name=HelloService;helloServiceImpl=HelloServiceHelper.narrow(ncRef.resolve_str(name);/调用HelloService对象的远程方法 System.out.println(Obtained a handle on server object:+helloServiceImpl);System.out.println(helloServiceImpl.sayHello();helloServiceImpl.shutdown();catch(Exception e).16.5 运行CORBA程序n运行程序之前,首先要对HelloService.idl进行编译。n接下来再编译所有的Java源文件。n接着先后运行命名服务器程序、服务器程序和客户程序。16.5 运行CORBA程序nJDK的安装目录的bin子目录下的idlj.exe程序负责编译IDL接口。n假定HelloService.idl文件位于C:chapter16src目录下,在DOS中转到该目录,然后运行命令:idlj-fall HelloService.idln以上命令会在C:chapter16srchello目录下生成以下Java类的源文件:nHelloServicePOA.java:服务器端的框架类。HelloServiceImpl类就继承了这个类。n_HelloServiceStub.java:客户端的存根类。nHelloService.java:Java版本的接口,与HelloService.idl对应。nHelloServiceHelper.java:辅助类,对数据进行CORBA类型与Java类型之间的转换。nHelloServiceHolder.java:辅助类,负责输入和输出数据。nHelloServiceOperations.java:该接口中包括sayHello()和shutdown()方法。HelloService接口继承了HelloServiceOperations接口。16.5 运行CORBA程序n启动命名服务器程序的命令为:start orbd-ORBInitialPort 1050其中1050为命名服务器监听的端口。n启动服务器程序的命令为:start java hello.HelloServer-ORBInitialPort 1050-ORBInitialHost localhostn运行客户程序的命令为:java hello.HelloClient-ORBInitialPort 1050-ORBInitialHost localhost练习题1n问题:以下哪些说法是正确的?问题:以下哪些说法是正确的?n选项选项:na)CORBA保证用不同编程语言编写的客户与服务器保证用不同编程语言编写的客户与服务器能够通信。能够通信。nb)IDL语言是一种与语言是一种与Java语言并列的编程语言。语言并列的编程语言。nc)IIOP协议是网络中协议是网络中ORB之间的通信协议。之间的通信协议。nd)IIOP协议建立在协议建立在TCP/IP协议的基础上。协议的基础上。ne)CORBA与与RMI都运用了请求代理机制。都运用了请求代理机制。n答案答案:a,c,d,e