赞
踩
首先自己去下载omniorb,解压后准备安装。我解压到了/root/omniorb4.1.5文件夹中。请一定要阅读README.unix,按照其指示的步骤,在终端中如下:
1) cd /root/omniorb4.1.5
2) 根据建议,创建一个独立的文件夹,如build:mkdir build
3) cd build
4) ../configure
5) make
6) make install
如果您刚通过ubuntu的光盘安装好ubuntu,那么您是到不了第六步的了,因为第5步的恶梦就开始了。在运行第5步时,提示找不到python.h。您可以通过whereis python找到路径/usr/include/python,可是到里面一瞅,并没有python.h,这是因为只安装了python的运行环境,没有安装python的开发版本。啥也不用想了,使用命令
apt-get install python-dev
如果当前用户不是管理员的话使用命令:
sudo apt-get install python-dev
安装python。不过我是下载了压缩包后,再安装的,具体步骤很简单,解压了python2.7.1后,运行如下命令:
1) ./configure
2) make
3) make install
就完了,而且这样环境变量也都设置好了。然后再回去执行omni安装的第5步就好了。如果一切顺利,则没问题了。
下面使用KDevelop创建一个运行omniorb的服务器项目。我还是喜欢使用IDE来管理技术验证性的小项目。新建一个C++项目。在其中添加Time.idl,填写其内容如下:
struct TimeOfDay {
short hour; short minute; short second;
};
interface Time {
TimeOfDay get_gmt();
};
该例子来自于《基于C++CORBA高级编程》(英文名为Advanced.CORBA.Programming.with.C++,在csdn即可下载到)。
然后创建一个TimeImpl类,可以使用KDevelop的类添加向导,无非就是帮你生成一个TimeImpl.h和一个TimeImpl.cpp文件。代码如下:
// 这是头文件
#include "Time.hh"
class TimeImpl : public virtual POA_Time {
public: TimeImpl(void);
virtual TimeOfDay get_gmt() throw(CORBA::SystemException);
public: virtual ~TimeImpl(void);
};
// 这是源文件
#include <time.h>
#include <iostream>
#include <omniconfig.h>
//#include <omniORB4/CORBA.h>
#include "Time.hh"
#include "timeimpl.h"
using namespace std;
TimeImpl::TimeImpl(void)
{
}
TimeImpl::~TimeImpl(void)
{
}
TimeOfDay TimeImpl::get_gmt() throw ( CORBA::SystemException)
{
time_t time_now;
time(&time_now);
struct tm *time_p = gmtime ( &time_now );
TimeOfDay tod;
tod.hour = time_p->tm_hour;
tod.minute = time_p->tm_min;
tod.second = time_p->tm_sec;
cout << time_p->tm_hour << ":" << time_p->tm_min << ":" << time_p->tm_sec << endl;
return tod;
}
// 最后是main函数所在的源文件
#include <iostream>
#include <omniconfig.h>
#include <time.h>
#include "Time.hh"
#include "timeimpl.h"
using namespace std;
int main ( int argc, char **argv )
{
try
{
CORBA::ORB_var orb = CORBA::ORB_init ( argc, argv );
CORBA::Object_var obj = orb->resolve_initial_references ( "RootPOA" );
PortableServer::POA_var poa = PortableServer::POA::_narrow ( obj );
PortableServer::POAManager_var mgr = poa->the_POAManager();
mgr->activate();
TimeImpl time_servant;
Time_var tm = time_servant._this();
CORBA::String_var str = orb->object_to_string ( tm );
cout << str << endl;
orb->run();
}
catch ( const CORBA::SystemException & )
{
cerr << "Uncaught CORBA Exception." << endl;
return 1;
}
return 0;
}
完了后修改项目生成文件CMakeLists.txt文件,我自己编写如下生成脚本:
cmake_minimum_required(VERSION 2.8)
project(server)
# 发现并使用omniidl编译所有的idl文件
message("发现并使用omniidl编译所有的idl文件")
file(GLOB_RECURSE FILE_LIST "*.idl")
foreach(src ${FILE_LIST})
message("发现idl文件: " ${src})
execute_process(COMMAND omniidl -C${PROJECT_SOURCE_DIR} -bcxx ${src})
endforeach()
# 发现并拼接所有使用omniidl生成的cc源文件
message("发现并拼接所有使用omniidl生成的cc源文件")
file(GLOB IDL_GEN_CPP_LIST "*SK.cc")
FOREACH(src ${IDL_GEN_CPP_LIST})
MESSAGE("发现omniidl生成的文件: " ${src})
STRING( REGEX MATCH "[^/]*//.cc$" ccFileName ${src} )
LIST(APPEND ccFileNameList ${ccFileName})
MESSAGE("截取其文件名为: " ${ccFileName} )
ENDFOREACH(src ${IDL_GEN_CPP_LIST})
add_executable(server ${ccFileNameList} timeimpl.cpp main.cpp)
target_link_libraries(server libomnithread.so libomniORB4.so libomniDynamic4.so libomniCodeSets4.so libCOS4.so libCOSDynamic4.so)
这里记着,在最后一行中,千万不要加上omnisslTP.so,这个万恶的ssl库,你暂时是找不到的。而omniorb中的README.unix中也写的很清楚,如果openSSL可用的话,添加该库,否则不要添加。当然“否则”后面的叙述是我说的。但是当你检查系统时,你会发现你的系统中确实是有openSSL,但那不是开发版,你可能会想下载libssl-dev来代替,那你就得重新编译一遍omniorb,还是别废这洋劲了。按上面的写吧。
在KDevelop中添加一个新类TimeImpl继承自POA_Time如下:
这样服务器就OK了,Build吧。完了后进入build子目录运行刚编译的可执行文件即可创建服务器。 客户端我是在windows上运行的,所以用Visual Studio创建的客户端,依然要在windows上安装omniorb,一定要看说明,其它项目配置之类的我实在不愿多说了,说明里写的很清楚,我还自己翻译了给同事使用。只贴一下源码吧
// main函数所在的源文件为
#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include "../OMNIIDLTest/TimeH.h"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
try {
if (argc != 2) {
cerr << "Usage: client IOR_string" << endl;
throw 0;
}
CORBA::ORB_var orb = CORBA::ORB_init(argc, argv);
CORBA::Object_var obj = orb->string_to_object(argv[1]);
if (CORBA::is_nil(obj)) {
cerr << "Nil time referenc." << endl;
throw 0;
}
Time_var tm = Time::_narrow(obj);
if (CORBA::is_nil(tm)) {
cerr << "Argument is not a Time reference" << endl;
throw 0;
}
TimeOfDay tod = tm->get_gmt();
cout << "Time in Greenwich is "
<< setw(2) << setfill('0') << tod.hour << ":"
<< setw(2) << setfill('0') << tod.minute << ":"
<< setw(2) << setfill('0') << tod.second << endl;
} catch (const CORBA::SystemException &) {
cerr << "Uncaught CORBA exception." << endl;
return 1;
}
return 0;
}
当然一定要添加入刚刚在windows平台上通过omniidl编译出来的头文件与源文件。编译完了后,把服务器运行时输出的从IOR:开始那一长串字符串都复制过来,然后所以客户端运行的参数就可以,如
client IOR:010000000d00000049444c3a54696d653a312e3000000000010000000000000068000000010102000f0000003139322e3136382e31352e3132390000989d00000e000000fe578cd24d00006c16000000000000000200000000000000080000000100000000545441010000001c00000001000000010001000100000001000105090101000100000009010100
完了,写的比较粗,以后再慢慢细化吧,主要是留个记录,也是为了给同事们讲解用的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。