corba服务--Hello World

news/2024/7/20 14:01:56 标签: java, 数据库, 内存管理

第一个corba服务---Hello World

本节摘要:本节介绍一个corba服务的开发过程,包含服务端和客户端,实现一个打印Hello World的功能。

preparation

1.开发背景介绍

      最近项目中一直在做corba的这块东西,项目中是在第三方的产品vbroker的产品上做的开发,再者我也主要是做客户端的调用,服务端用的是C++来实现的,具体的发布和部署过程也不清楚。那我就”不爽啊”,为啥咱就不能写一个corba服务,从定义idl文件到开发再到发布?说来咱就来,当然是从最简单的来了,最开始学习java的时候,第一个程序是打印Hello World。OK,come on,咱就用corba写一个服务,输出Hello World然后打印出来瞧瞧。搜集了网上相关资料,并加以整理和理解,咱的第一个corba服务(采用corba静态调用的方式)就问世了。

     至于什么是corba,咱就不介绍了,网上一网一箩筐,corba太高深的咱也介绍不了,就不班门弄斧了。

2.IDL介绍

全称:Interface Description Language

使用Java(TM)编写的API提供基于标准的和CORBA的交互性和连接性。

用于描述接口,类似于PRC的.x文件。接口定义语言类似一个协议,来规定接入对象的行为。

用RPC / COM / CORBA技术来编写分布式系统时都需要接口定义语言(IDL)。

特点:

1、IDL是一种规范语言。

2、IDL看上去很像C语言。

3、OMG IDL的目的是定义接口和精简分布对象的过程。

4、IDL分离对象的接口与其实现。

5、IDL剥离了编程语言和硬件的依赖性。

6、使用IDL定义接口的客户机程序员不知道接口背后的实现细节。

7、IDL提供一套通用的数据类型,并以这些数据类型来定义更为复杂的数据类型。

IDL的语法需要的话可以专门的去学习,这里不是我介绍的重点。

3.idlj命令介绍

   idlj命令是把idl文件生成java代码,此命令在JDK的安装目录的bin目录下可以找到

   idlj命令的使用语法如下:

   idlj [选项] <idl文件>

其中,<idl 文件> 是包含 IDL 定义的文件的名称,而[选项] 是以下所列选项的任一组合。这些选项是可选的,并且可以以任意顺序显示;<idl 文件> 是必须的并且必须显示在最后。

选项:
java-pan/201207/201207082106124503.jpg" alt="idlj" width="813" height="483" border="0" />
当然,也有把idl文件生成C++代码的,这里我就不关心了。

还有一些软件公司提供的有实现这种转换的产品,比如borland。

4.idlj生成的桩和骨架介绍

因为我要客户端和服务端都自己来实现,所以我使用的idlj命令的选项为-fall

我使用的idl文件名称为Hello.idl(后面会把详细的idl文件内容列出来),那么我运行的命令为 idlj –fall Hello.idl

idl生成java文件的步骤:

1.打开cmd窗口

2.切换到JDK安装目录下的bin目录

3.把Hello.idl文件拷贝到JDK的bin目录下

4.运行idlj命令,由idl文件生成相应的java文件

java-pan/201207/201207082106131613.jpg" alt="idlj -fall" width="680" height="91" border="0" />

运行完成,会在JDK的bin目录下生成一个HelloApp文件夹,HelloApp文件夹包含以下6个java文件:

_HelloStub.java

Hello.java

HelloHelper.java

HelloHolder.java

HelloOperations

HelloPOA.java

5.orbd命令介绍

orbd是用来使客户能够透明地查找和调用持久对象在服务器上应用环境,各个参数如下:

java-pan/201207/20120708210614434.jpg" alt="orbd" width="701" height="152" border="0" />

sun关于orbd的介绍文档地址如下:http://download.oracle.com/javase/1.4.2/docs/guide/idl/orbd.html

6.netstat命令介绍

netstat命令是在内核中访问网络及相关信息的程序,它能提供TCP连接,TCP和UDP监听,进程内存管理的相关报告。

java-pan/201207/201207082106192872.jpg" alt="netstat" width="717" height="571" border="0" />

7.开发环境

system:win7  myeclipse:6.5  JDK:1.5  project:java project

8.项目结构

java-pan/201207/201207082106241886.jpg" alt="project" width="361" height="488" border="0" />

start

1.定义idl文件

文件名称:HelloApp.idl

文件内容:

module HelloApp{
   interface Hello{
      string sayHello();
   };
};

2.生成桩和骨架文件

根据前面介绍的步骤,生成java文件,把生成的HelloApp文件夹拷贝到工程的src目录;

这里生成的文件就不贴出来了,后面会把整个工程上传上去;

3.实现服务端

   (1)实现sayHello方法

   HelloImpl.java

HelloImpl.java
 1 package server;
 2 
 3 import HelloApp.HelloPOA;
 4 
 5 /**
 6  * 
 7  *Module:          HelloImpl.java
 8  *Description:    服务端实现sayHello()方法
 9  *Company:       
10  *Version:          1.0.0
11  *Author:           pantp
12  *Date:              Jul 8, 2012
13  */
14 public class HelloImpl extends HelloPOA {
15 
16     public String sayHello() {
17         return "\nHello World\n";
18     }
19 
20 }

   (2)开发启动ORB以及等待远程客户机调用的代码

   HelloServer.java

HelloServer.java
 1 package server;
 2 
 3 import org.omg.CORBA.ORB;
 4 import org.omg.PortableServer.POA;
 5 import org.omg.PortableServer.POAHelper;
 6 import HelloApp.Hello;
 7 import HelloApp.HelloHelper;
 8 import org.omg.CosNaming.NamingContextExt;
 9 import org.omg.CosNaming.NamingContextExtHelper;
10 import org.omg.CosNaming.NameComponent;
11 
12 /**
13  * 
14  *Module:          HelloServer.java
15  *Description:    启动服务端的服务
16  *Company:       
17  *Version:          1.0.0
18  *Author:           pantp
19  *Date:              Jul 8, 2012
20  */
21 public class HelloServer {
22 
23     //启动ORB以及等待远程客户机的调用的代码
24     public static void main(String args[]) throws Exception {
25         // -ORBInitialPort 1050
26         args = new String[2];
27         args[0] = "-ORBInitialPort";
28         args[1] = "1050";//端口
29 
30         // 创建一个ORB实例
31         ORB orb = ORB.init(args, null);
32         System.out.println("server--->11111");
33 
34         // 得到一个RootPOA的引用,并激活POAManager
35         org.omg.CORBA.Object obj=orb.resolve_initial_references("RootPOA");
36         POA rootpoa = POAHelper.narrow(obj);
37         rootpoa.the_POAManager().activate();
38 
39         System.out.println("server--->22222");
40 
41         // 创建一个HelloImpl实例
42         HelloImpl helloImpl = new HelloImpl();
43         
44         System.out.println("server--->33333");
45 
46         // 从服务中得到对象的引用
47         org.omg.CORBA.Object ref = rootpoa.servant_to_reference(helloImpl);
48         Hello href = HelloHelper.narrow(ref);
49 
50         System.out.println("server--->44444");
51 
52         // 得到一个根名称的上下文
53         org.omg.CORBA.Object objRef = orb
54                 .resolve_initial_references("NameService");
55         NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);
56 
57         System.out.println("server--->55555");
58 
59         // 在命名上下文中绑定这个对象
60         String name = "Hello";
61         NameComponent path[] = ncRef.to_name(name);
62         ncRef.rebind(path, href);
63 
64         System.out.println("server--->66666");
65 
66         // 启动线程服务,等待客户端调用
67         orb.run();
68     }
69 }

 

4.实现客户端

以桩作为客户端应用程序的基础,客户机建立在桩之上,通过Java IDL提供的名字服务查询服务器,获得远程对象的引用,然后调用远程对象中的方法;

HelloClient.java

HelloClient.java
 1 package client;
 2 
 3 import HelloApp.Hello;
 4 import HelloApp.HelloHelper;
 5 import org.omg.CORBA.ORB;
 6 import org.omg.CORBA.ORBPackage.InvalidName;
 7 import org.omg.CosNaming.NamingContextExt;
 8 import org.omg.CosNaming.NamingContextExtHelper;
 9 import org.omg.CosNaming.NamingContextPackage.CannotProceed;
10 import org.omg.CosNaming.NamingContextPackage.NotFound;
11 
12 /**
13  * 
14  *Module:          HelloClient.java
15  *Description:    客户端的初始化以及调用的代码
16  *Company:       
17  *Version:          1.0.0
18  *Author:           pantp
19  *Date:              Jul 8, 2012
20  */
21 public class HelloClient {
22 
23     static Hello helloImpl;
24 
25     static {
26         System.out.println("客户端的初始化配置开始......." + System.currentTimeMillis());
27 
28         // -ORBInitialHost 127.0.0.1 -ORBInitialPort 1050
29         String args[] = new String[4];
30         args[0] = "-ORBInitialHost";
31         args[1] = "127.0.0.1";// 服务端的IP地址
32         args[2] = "-ORBInitialPort";
33         args[3] = "1050";// 服务端的端口
34 
35         // 创建一个ORB实例
36         ORB orb = ORB.init(args, null);
37 
38         // 获取根名称上下文
39         org.omg.CORBA.Object objRef = null;
40         try {
41             objRef = orb.resolve_initial_references("NameService");
42         } catch (InvalidName e) {
43             e.printStackTrace();
44         }
45         NamingContextExt neRef = NamingContextExtHelper.narrow(objRef);
46 
47         String name = "Hello";
48         try {
49             helloImpl = HelloHelper.narrow(neRef.resolve_str(name));
50         } catch (NotFound e) {
51             e.printStackTrace();
52         } catch (CannotProceed e) {
53             e.printStackTrace();
54         } catch (org.omg.CosNaming.NamingContextPackage.InvalidName e) {
55             e.printStackTrace();
56         }
57 
58         System.out.println("客户端的初始化配置结束......." + System.currentTimeMillis());
59     }
60     
61     public static void main(String args[]) throws Exception {
62 //        init();
63         sayHello();
64     }
65 
66     // 客户端的初始化配置
67 /*    public static void init() throws Exception {
68         System.out.println("客户端的初始化配置开始......." + System.currentTimeMillis());
69         
70         // -ORBInitialHost 127.0.0.1 -ORBInitialPort 1050
71         String args[] = new String[4];
72         args[0] = "-ORBInitialHost";
73         args[1] = "127.0.0.1";//服务端的IP地址
74         args[2] = "-ORBInitialPort";
75         args[3] = "1050";//服务端的端口
76 
77         // 创建一个ORB实例
78         ORB orb = ORB.init(args, null);
79 
80         // 获取根名称上下文
81         org.omg.CORBA.Object objRef = orb
82                 .resolve_initial_references("NameService");
83         NamingContextExt neRef = NamingContextExtHelper.narrow(objRef);
84 
85         String name = "Hello";
86         helloImpl = HelloHelper.narrow(neRef.resolve_str(name));
87 
88         System.out.println("客户端的初始化配置结束......." + System.currentTimeMillis());
89     }*/
90 
91     // 调用corba服务的方法
92     public static void sayHello() {
93         String str = helloImpl.sayHello();
94         System.out.println(str);
95     }
96 }

 

5.启动应用程序

  1.运行startorbd.bat文件,启动orbd服务

    startorbd.bat文件内容如下:

@rem 切换到JDK安装路径下的bin目录 根据本机的环境做相应的更改
cd/d  "D:\Program Files\Java\jdk1.5.0_06\bin"

 

@rem 只有端口和IP是可以变化的,这里的端口和IP是根据HelloServer中的设置来定义的
@rem 1050为命名服务器监听的端口,对应HelloServer中的端口;
@rem 127.0.0.1为服务启动的IP地址,对应HelloServer中的IP地址
orbd -ORBInitialPort 1050 -ORBInitialHost 127.0.0.1

运行批处理文件的截图如下:

java-pan/201207/201207082106249312.jpg" alt="startorbd" width="752" height="166" border="0" />
可以采用netstat命令检查服务1050是否正常的启动:

java-pan/201207/201207082106268623.jpg" alt="netstat -ant" width="756" height="524" border="0" />

   2.运行服务端程序

    运行HelloServer.java的main方法,console窗口打印的信息如下:

java-pan/201207/201207082106273192.jpg" alt="server" width="589" height="226" border="0" />

    说明:运行本来是没有日志的,是我人为的在代码中加入了一些打印语句

3.运行客户端程序

运行HelloClient.java的main方法,console窗口打印的信息如下

java-pan/201207/201207082106287553.jpg" alt="client" width="601" height="220" border="0" />

以上完成了corba静态调用的整个过程;

 

再把 说明.txt 贴出来吧:

java-pan/201207/201207082109401042.jpg" alt="说明" width="702" height="435" border="0" />

项目源代码下载:http://pan.baidu.com/share/link?shareid=170425&uk=1678594189


此文转自: http://www.cnblogs.com/java-pan/archive/2012/07/08/corba.html
java-pan/aggbug/2581861.html?type=1&webview=1" alt="" width="1" height="1" />

转载于:https://www.cnblogs.com/xjx-user/archive/2012/12/19/2824736.html


http://www.niftyadmin.cn/n/1195075.html

相关文章

cat 常用的日志分析架构方案_数据架构师对学习如何设计现代实时数据分析解决方案...

事件流应用程序不执行应用程序&#xff0c;它们只是充当现实世界与应用程序之间的缓冲&#xff0c;为每个应用程序和主题保留一个索引&#xff0c;因此如果应用程序重新启动&#xff0c;它可以从每个队列中的下一个事件&#xff08;如果它是有状态的&#xff09;恢复处理。如果…

英特尔收购AI领头企业Nervana Systems望实现组合创新

英特尔支持着数以万计的云和数十亿的智能互联设备。当前&#xff0c;云计算无处不在&#xff0c;计算成本延续摩尔定律的脚步也日益下降&#xff0c;终端连接的可用性也不断提高&#xff0c;这些互联设备每天都在产生数百万 TB 的数据。如何分析这些数据并从中发掘蕴藏的价值是…

python 文字小游戏_Python小项目——自动文字对战

Python文字PK小游戏项目明确项目目标人机PK小游戏这个游戏中&#xff0c;会随机生成玩家和敌人的属性&#xff0c;同时互相攻击&#xff0c;直至一方血量小于零。战斗会持续三局&#xff0c;采取三局两胜制&#xff0c;最后输出战斗结果&#xff0c;公布获胜方。示意项目练习延…

字符串型的数字相加减_字符串乘法

读完本文&#xff0c;你可以去力扣拿下如下题目&#xff1a;43.字符串相乘-----------对于比较小的数字&#xff0c;做运算可以直接使用编程语言提供的运算符&#xff0c;但是如果相乘的两个因数非常大&#xff0c;语言提供的数据类型可能就会溢出。一种替代方案就是&#xff0…

python 操作mysql 数据库

#!/usr/bin/env python #codingutf-8 import MySQLdb,sys connMySQLdb.connect(hostip,userusername,passwdpasswd) cursorconn.cursor(); conn.select_db(‘dbname) cursor.execute(sql_sentence) resultcursor.fetchone() count result[0]转载于:https://www.cnblogs.com/lo…

国外黑客不甘寂寞 称将揭露诺顿源代码

本文讲的是国外黑客不甘寂寞 称将揭露诺顿源代码&#xff0c;北京时间1月17日早上消息&#xff0c;黑客似乎永远不甘寂寞&#xff0c;他们希望成为人们谈论的中心。相信发生在2011年末中国互联网史上最大规模的泄密事件还未在人们的关注视线中消退&#xff0c;近日&#xff0c;…

java values()_Java Hashtable values()方法与示例

哈希表类values()方法values()方法在java.util包中可用。values()方法用于获取此哈希表中存在的所有值以在集合中进行查看。values()方法是一种非静态方法&#xff0c;只能通过类对象访问&#xff0c;如果尝试使用类名称访问该方法&#xff0c;则会收到错误消息。values()方法在…

软件工程学科对人类社会和生活的重要意义_高考志愿:软件工程专业的就业前景如何?...

现在大家都知道&#xff0c;IT行业现在很热门&#xff0c;薪资也是很高。软件工程作为IT中最热门的专业&#xff0c;更是目前社会需求量很大的专业。有些人可能会觉得软件工程毕业就是码农&#xff0c;每天都很累&#xff0c;没有自己的生活。对未来存有担忧。那么软件工程的就…