【CORBA】连接两台服务器的问题
写了一个corba程序,由于特殊需要,服务分散在两台主机上,现在客户端要连接这两台主机进行通信。
启动客户端的命令行是这样的 app.exe -ORBInitRef NameService=corbaloc:iiop:host1:1060,iiop:host2:1060/Nameservice
但是这样只能获得host1的nameservice,第二台报异常CosNaming::NamingContext::NotFound,
客户端先调用:
void init(int argc,char* argv[]){
QString arg;
for(int i=0;i<argc;i++){
arg = arg+QString::number(i,10)+QString(argv[i]);
}
QMessageBox::information(0,"arg",arg);
try
{
CORBA::ORB_var orb = CORBA::ORB_init(argc,argv);
CORBA::Object_var obj = orb->resolve_initial_references("NameService");
inc = CosNaming::NamingContextExt::_narrow(obj);
cout<<"Got NameService."<<endl;
}
catch (const CORBA::Exception&)
{
cerr<<"Uncaught CORBA exception."<<endl;
QMessageBox::warning(0,"w","init CORBA::Exception");
}
}
然后分别调用:getQuery()和getPayAC()
AB::Query_var getQuery(){
CORBA::Object_var object;
if(CORBA::is_nil(query)){
CosNaming::Name name;
name.length(1);
name[0].id = CORBA::string_dup("Query_JAVA");
try{
object = inc->resolve(name);
query = AB::Query::_narrow(object);
cout<<"Get a handle of Object Query."<<endl;
}catch(CosNaming::NamingContext::NotFound& ex){
cerr<<"Context not found."<<endl;
QMessageBox::warning(0,"AB","CosNaming::NamingContext::NotFound");
} catch(CORBA::TRANSIENT& ex) {
cerr << "Caught system exception TRANSIENT -- unable to contact the "
<< "naming service." << endl
<< "Make sure the naming server is running and that omniORB is "
<< "configured correctly." << endl;
QMessageBox::warning(0,"AB","CORBA::TRANSIENTException");
}
catch(CORBA::SystemException& ex) {
cerr << "Caught a CORBA::" << ex._name()<< " while using the naming service." << endl;
QMessageBox::warning(0,"AB","CORBA::SystemException");
}
return query;
}
}
AC::PayAC_var getPayAC(){
CORBA::Object_var obj = orb->resolve_initial_references("NameService");
inc = CosNaming::NamingContextExt::_narrow(obj);
CORBA::Object_var object;
if(CORBA::is_nil(pay)){
CosNaming::Name name;
name.length(1);
name[0].id = CORBA::string_dup("PayAC_JAVA");
try{
object = inc->resolve(name);
pay= AC::PayAC::_narrow(object);
cout<<"Get a handle of Object PayAC."<<endl;
}catch(CosNaming::NamingContext::NotFound& ex){
cerr<<"Context not found."<<endl;
QMessageBox::warning(0,"AC","CosNaming::NamingContext::NotFound");
} catch(CORBA::TRANSIENT& ex) {
cerr << "Caught system exception TRANSIENT -- unable to contact the "
<< "naming service." << endl
<< "Make sure the naming server is running and that omniORB is "
<< "configured correctly." << endl;
QMessageBox::warning(0,"AC","CORBA::TRANSIENTException");
}
catch(CORBA::SystemException& ex) {
cerr << "Caught a CORBA::" << ex._name()<< " while using the naming service." << endl;
QMessageBox::warning(0,"AC","CORBA::SystemException");
}
return pay;
}
}
我猜测是两台主机需要两个上下文环境,现在问题是根据命令行参数怎么得到两台主机上的对象。求大侠不吝赐教~~
启动客户端的命令行是这样的 app.exe -ORBInitRef NameService=corbaloc:iiop:host1:1060,iiop:host2:1060/Nameservice
但是这样只能获得host1的nameservice,第二台报异常CosNaming::NamingContext::NotFound,
客户端先调用:
void init(int argc,char* argv[]){
QString arg;
for(int i=0;i<argc;i++){
arg = arg+QString::number(i,10)+QString(argv[i]);
}
QMessageBox::information(0,"arg",arg);
try
{
CORBA::ORB_var orb = CORBA::ORB_init(argc,argv);
CORBA::Object_var obj = orb->resolve_initial_references("NameService");
inc = CosNaming::NamingContextExt::_narrow(obj);
cout<<"Got NameService."<<endl;
}
catch (const CORBA::Exception&)
{
cerr<<"Uncaught CORBA exception."<<endl;
QMessageBox::warning(0,"w","init CORBA::Exception");
}
}
然后分别调用:getQuery()和getPayAC()
AB::Query_var getQuery(){
CORBA::Object_var object;
if(CORBA::is_nil(query)){
CosNaming::Name name;
name.length(1);
name[0].id = CORBA::string_dup("Query_JAVA");
try{
object = inc->resolve(name);
query = AB::Query::_narrow(object);
cout<<"Get a handle of Object Query."<<endl;
}catch(CosNaming::NamingContext::NotFound& ex){
cerr<<"Context not found."<<endl;
QMessageBox::warning(0,"AB","CosNaming::NamingContext::NotFound");
} catch(CORBA::TRANSIENT& ex) {
cerr << "Caught system exception TRANSIENT -- unable to contact the "
<< "naming service." << endl
<< "Make sure the naming server is running and that omniORB is "
<< "configured correctly." << endl;
QMessageBox::warning(0,"AB","CORBA::TRANSIENTException");
}
catch(CORBA::SystemException& ex) {
cerr << "Caught a CORBA::" << ex._name()<< " while using the naming service." << endl;
QMessageBox::warning(0,"AB","CORBA::SystemException");
}
return query;
}
}
AC::PayAC_var getPayAC(){
CORBA::Object_var obj = orb->resolve_initial_references("NameService");
inc = CosNaming::NamingContextExt::_narrow(obj);
CORBA::Object_var object;
if(CORBA::is_nil(pay)){
CosNaming::Name name;
name.length(1);
name[0].id = CORBA::string_dup("PayAC_JAVA");
try{
object = inc->resolve(name);
pay= AC::PayAC::_narrow(object);
cout<<"Get a handle of Object PayAC."<<endl;
}catch(CosNaming::NamingContext::NotFound& ex){
cerr<<"Context not found."<<endl;
QMessageBox::warning(0,"AC","CosNaming::NamingContext::NotFound");
} catch(CORBA::TRANSIENT& ex) {
cerr << "Caught system exception TRANSIENT -- unable to contact the "
<< "naming service." << endl
<< "Make sure the naming server is running and that omniORB is "
<< "configured correctly." << endl;
QMessageBox::warning(0,"AC","CORBA::TRANSIENTException");
}
catch(CORBA::SystemException& ex) {
cerr << "Caught a CORBA::" << ex._name()<< " while using the naming service." << endl;
QMessageBox::warning(0,"AC","CORBA::SystemException");
}
return pay;
}
}
我猜测是两台主机需要两个上下文环境,现在问题是根据命令行参数怎么得到两台主机上的对象。求大侠不吝赐教~~
...全文
相关推荐
.Net 平台N 层分布式开发探讨
互联网的连接特性使得成百上千的计算机可以协同工作,极大地扩展了分布式处理的规模,并超越了传统的浏览器/服务器(B/S)模型。
CORBA客户服务器编程.rar_Java CORBA_corba_corba java_分布式
**服务器启动与客户端连接**:"CountServer.java"通常包含了服务器端的启动逻辑,它会启动ORB,并注册实现接口的服务器对象。
java客户端通过corba方式访问c++服务器
**异常处理** - 在实际应用中,应当对可能出现的各种异常情况进行妥善处理,比如网络连接失败、对象不存在等。 - 例如,在C++服务器端,可以使用异常捕获块来处理可能出现的异常情况。3.
CORBA中的简单C ++客户端/服务器
**启动监听**: 设置ORB监听特定端口,等待客户端连接。**六、加密服务示例**`crypt_service.zip`可能包含一个示例,演示如何使用CORBA实现安全通信。
使用IIOP.NET 连接C#与C++程序(基于corba)
IIOP.NET连接C#与C++程序的知识点主要围绕着CORBA(Common Object Request Broker Architecture,公共对象请求代理体系结构)展开,这是一种跨语言、跨平台的中间件系统


