对象中间件--CORBA开发练习
来源:互联网 发布:java编写倒99乘法表 编辑:程序博客网 时间:2024/06/07 17:02
一 实验目的
通过实例掌握CORBA的开发过程:主要包括:接口定义;接口的对象实现;服务器端代码编写;客户端代码编写;CORBA Server/Client的编译与运行;
二 实验要求
1)基于CORBA技术开发一个考试成绩查询系统,主要包括:服务器部分:实现查询和录入服务;客户端部分包括录入和查询部分
2)服务端使用Java编写,使用JDBC访问数据库;客户端使用Java和C++分别编写。
三 实验过程
实验准备
1.下载OmniORB
首先需要到这里 下载一个win32的OmniORB。文件名是”omniORB-4.1.0-x86_win32_vc6.zip”。然后解压缩到一个位置。
2.环境变量
将jdk\bin以及omniORB-4.1.0\bin\x86_win32配置到环境变量path中,加到原有的变量后,用分号隔开。
下面是我的Path中部分环境变量配置,第一二个位VC的环境变量,第三个为JDK的环境变量,第四个为OmniORB的环境变量
D:\VC++6.0\Microsoft Visual Studio\Common\MSDev98\Bin;D:\VC++6.0\Microsoft Visual Studio\VC98\Bin;D:\Java\jdk\bin;D:\omniORB-4.1.0\bin\x86_win32
实验内容
(一).服务接口定义
创建自己的文件夹,新建DataService.idl 文件,定义查询与录入函数。
DataService.idl的代码如下:
interface DataService{ void insert(in string stuName,in string StuNo,in float score);float search(in string stuNo);};
(二).Java实现Corba服务器端
1.用以下命令生成存根与框架:
idlj -fall DataService.idl
生成如下文件:
2.在自己创建的文件夹下,创建server文件夹,并将1)得到的存根和框架java文件拷贝至server,并使用eclipse创建一工程,将这些文件包含进去。
目录结构为:
3.编写服务端服务实现,并写main函数以启动corba服务
编写的DataServiceServer.java的代码如下:
package com.wangkai;import org.omg.CosNaming.*;import org.omg.CORBA.*;import org.omg.CosNaming.*;import org.omg.PortableServer.*;import com.wangkai.DBmanager;//编写相对应的服务,一定要从 _类名ImplBase继承,并实现相应的方法class DataServiceImpl extends DataServicePOA // 具体的服务实现{ private ORB orb; public void setOrb(ORB orb_val) { this.orb = orb_val; } @Override public void insert(String stuName, String StuNo, float score) { // TODO Auto-generated method stub DBmanager.insert(stuName, StuNo, score); } @Override public float search(String stuNo) { // TODO Auto-generated method stub return DBmanager.search(stuNo); }}public class DataServiceServer// 起动服务的程序{ public static void main(String args[]) { try { System.out.println("创建和初始化 ORB "); ORB orb = ORB.init(args, null); POA rootpoa = POAHelper.narrow(orb .resolve_initial_references("RootPOA")); rootpoa.the_POAManager().activate(); System.out.println("创建服务对象并将其向 ORB 注册 "); DataServiceImpl dataServiceImpl = new DataServiceImpl(); dataServiceImpl.setOrb(orb); // System.out.println(orb.object_to_string(sysProImpl)); org.omg.CORBA.Object objRef = orb .resolve_initial_references("NameService"); NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef); NameComponent[] path = { new NameComponent("DataService", "") }; org.omg.CORBA.Object ref = rootpoa .servant_to_reference(dataServiceImpl); DataService href = DataServiceHelper.narrow(ref); System.out.println(orb.object_to_string(href)); System.out.println(ncRef.getClass().toString()); ncRef.rebind(path, href); System.out.println("DataServiceServer ready and waiting ..."); orb.run(); } catch (Exception e) { System.err.println("Error: " + e); e.printStackTrace(System.out); } }}
4.在工程中创建DBmanager类,用来连接mysql数据库,DBmanager.java的代码如下:
package com.wangkai;import java.sql.*;public class DBmanager { private static Connection conn; private static Statement sta; private static ResultSet result; private static String driver = "com.mysql.jdbc.Driver"; private static String url = "jdbc:mysql://localhost:3306/mycobra"; private static float score; public static Connection getcon() { Connection con = null; try { Class.forName(driver);// 注册驱动 } catch (ClassNotFoundException e) { System.out.println("未完成注册驱动"); e.printStackTrace(); } try { con = DriverManager.getConnection(url, "root", "");// 建立连接 } catch (SQLException e) { // TODO: handle exception System.out.println("未完成数据连接"); e.printStackTrace(); } return con; } public static void insert(String stuName, String StuNo, float score) { try { conn = getcon(); String sql = "insert into mytable(stuName,stuNo,score) values(?,?,?)"; PreparedStatement ps = conn.prepareStatement(sql); ps.clearBatch(); ps.setString(1, stuName); ps.setString(2, StuNo); ps.setFloat(3, score); ps.addBatch(); ps.executeBatch(); ps.close(); conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static float search(String StuNo) { try { conn = getcon(); String sql = "select * from mytable where StuNo=" + StuNo; sta = conn.createStatement(); result = sta.executeQuery(sql); if (result.next()) { String stuName = result.getString(1); String stuNo = result.getString(2); score = result.getFloat(3); } sta.close(); conn.close(); } catch (SQLException e) { e.printStackTrace(); } return score; }// public static void main(String[] args){// getcon();// insert("wangkai", "2012014315", 99.9f);// // }}
(三).Java实现Corba客户端
1.在自己创建的文件夹下,创建java_client文件夹,并将(二)的 1 得到的存根和框架java文件拷贝至java,并使用eclipse创建一工程,将这些文件包含进去。
目录结构为:
2.编写客户端对查询与录入的调用
DataServiceClient.java的代码如下:
package com.wangkai;import org.omg.CosNaming.*;import org.omg.CORBA.*;public class DataServiceClient { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub try { String SetInfo, ReturnInfo, ref; float score = 0; org.omg.CORBA.Object objRef; DataService dataserviceRef; ORB orb = ORB.init(args, null); /* * if (args.length >= 1) { ref = args[0]; //System.out.println(ref); * } else { System.out.println("aaaaaaaaaaaaaaaaaa"); return ; } */ // 下面一条语句得到的是一个NamingContext对象,并非SysProp对象 // objRef = orb.string_to_object(ref); // dataserviceRef = DataServiceHelper.narrow(objRef); objRef = orb.resolve_initial_references("NameService"); System.out.println(orb.object_to_string(objRef)); NamingContext ncRef = NamingContextHelper.narrow(objRef); NameComponent nc = new NameComponent("DataService", ""); NameComponent path[] = { nc }; dataserviceRef = DataServiceHelper.narrow(ncRef.resolve(path)); if (args.length > 1) { SetInfo = args[1]; } else { SetInfo = "0"; } System.out.println("开始调用"); System.out.println("运行成功!"); System.out.println("**********成绩录入**************"); dataserviceRef.insert("wangkai", "2012014315", 90); System.out.println("成绩录入成功!\n"); System.out.println("**********成绩查询**************"); String searchStuNo = "2012014315"; float getScore = dataserviceRef.search(searchStuNo); System.out.println("学号 "+searchStuNo+" 的成绩为: "+getScore); } catch (Exception e) { e.printStackTrace(); } }}
3.创建数据库
在MySQL中创建数据库mycobra,在数据库中建表mytable
4.运行测试
1).启动命名服务
运行Java服务端之前须先启动命名服务,如果不启动,将会出现如下错误
在JDK安装目录下(我的目录为D:\Java\jdk\bin )启动tnameserv.exe 命名服务
2).启动Java服务器端
启动之前先要启动MySQL,还要注意将MySQL的连接的jar包加入到服务器端工程中
现在启动Java服务器端DataServiceServer.java
启动成功
3).启动Java客户端
启动Java客户端DataServiceClient.java
数据库显示
(四).C++实现Corba客户端
1.用以下命令生成存根与框架:
在命令行运行omniidl -bcxx DataService.idl
得到.hh文件和.cc文件,将后缀名改为.h和.c,并在.c文件中#include “.hh” 改为#include “*.h”。
如果提示“omniidl 不是内部或外部命令,也不是可运行的程序”一般是因为环境变量没配置好或者下载的OmniORB包有问题
2.创建工程
在之前建的目录下,创建C_client文件夹, 并将上一步所得到的文件拷贝至C_client。使用VC++6.0创建工程,并将存根与框架程序加入工程。
3.配置VC环境
.1).生成注册表
在omniORB-4.1.0的根目录下有sample.reg,双击它,在注册表内生成样例条目。在HKEY_LOCAL_MACHINE/SOFTWARE/omniORB/InitRef 下加 名为”1”,值为 “NameService=corbaname::127.0.0.1”
.2).配置工具选项
Tools–>Options选择Directory标签,在Include files下加入omniORB的lib和include路径
在Library files下加入omniORB的lib路径
3).配置工程设置
Project–>Setting,选择C++,分别对C++ Language,Code Generation,Preprocessor进行设置
C++ Language下勾选“Enable Exception Handling”
Code Generation下的Use runtime library选择Multithreaded DLL
Preprocessor添加宏定义
“WIN32,x86,_WIN32_WINNT=0x0400,NT,OSVERSION=4”
选择Link选项卡,Category选择Input,添加库模块
ws2_32.lib mswsock.lib advapi32.lib omniORB410_rt.lib omniDynamic410_rt.lib omnithread33_rt.lib
填写附加库路径,我的为“D:\omniORB-4.1.0\lib\x86_win32 ”
4.创建客户端程序
使用VC++6.0创建一个C++的工程,然后将将.h文件和.cpp文件加入到工程中,然后编写client.cpp文件进行编码,代码如下:
#include "DataService.h"#include <stdio.h>int main(int argc,char* argv[]){ try{ CORBA::ORB_var orb = CORBA::ORB_init(argc,argv); char* IORStr= "IOR:000000000000001449444c3a44617461536572766963653a312e3000000000010000000000000086000102000000000e3137322e31372e36332e3132340017f500000031afabcb0000000020e0bde78300000001000000000000000100000008526f6f74504f410000000008000000010000000014000000000000020000000100000020000000000001000100000002050100010001002000010109000000010001010000000026000000020002"; CORBA::Object_var obj = orb->string_to_object(IORStr); if(CORBA::is_nil(obj)){ printf("Nil Score Reference"); throw 0; } DataService_var tm = DataService::_narrow(obj); if(CORBA::is_nil(tm)){ printf("Nil Score Reference"); throw 0; } printf("成绩为 %f\n ",tm->search("2012014315")); }catch(const CORBA::Exception&){ printf("Exception\n"); return 1; } return 0;}
其中源码中的IORStr串是Java服务器端启动时产生的IOR串,直接复制过来就可以了。然后系统会根据IORStr串去连接远程Corba服务器。然后根据产生的连接进行产生一个远程对象,进行相应的操作。
5.运行C++客户端
编译连接客户端程序,并运行(前提是启动Java服务器端)
C++客户端可以获取Java服务器端的数据
- 对象中间件--CORBA开发练习
- 实习二 对象中间件--CORBA开发练习 java实现
- 对象中间件--CORBA
- CORBA中间件的开发过程
- 中间件corba
- CORBA规范和CORBA中间件
- 【中间件】(三):CORBA规范
- 基于CORBA规范的中间件——CORBA基本原理
- 基于CORBA规范的中间件——CORBA基本原理
- IIOP.NET与CORBA中间件应用技术
- 操作系统支持实时中间件CORBA的性能
- CORBA 介绍之实践练习
- 中间件小结——第二部分:CORBA 规范与 CORBA中间件
- 深入探索CORBA对象生命周期之慨述-Java基础-Java-编程开发
- CORBA对象生命周期之早期和后期绑定-Java基础-Java-编程开发
- CORBA对象生命周期之实现和内存管理-Java基础-Java-编程开发
- CORBA对象生命周期之生命周期的评估-Java基础-Java-编程开发
- J2EE、CORBA、DNA三种主流中间件平台比较
- 七牛android-7.0demo工程
- C++ 10.3.7 从map对象中删除元素
- Apache Shiro 使用手册(四)Realm 实现
- [LeetCode]Single Number
- 轻松自动化---selenium-webdriver(python) (二)
- 对象中间件--CORBA开发练习
- js闭包
- Reorder List
- response内置对象
- 堆排序 HeapSort
- Android5.x新特性之 Toolbar和Theme的使用
- Unity导出的iOS项目出错Use of undeclared identifier 'GL_BGRA_EXT'
- openstack快照分析
- 使用EXCEL设置“下拉菜单”选项功能