对象中间件--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服务器端的数据
这里写图片描述

1 0
原创粉丝点击