您的位置:首页 > 编程语言 > C语言/C++

基于Corba技术使用java与C++混合编程

2012-03-10 20:05 661 查看
本文主要以开源代码omniorb4.1.1为例,服务端用C++编写,客户端用java编写。这种模式适合很多企业级SOA的实际应用,Web Sevice与不同的系统之间通过中间件桥梁通讯,中间件本身支持不同网络、异构系统、硬件和语言,从而为企业的系统资源整合提供一个最佳的解决方案。
测试环境
1、 操作系统
WINDOWS 7
2、系统
处理器:Intel(R) Core(TM) i5-2401M CPU @ 2.30GH 2.30GH
安装内存:3.00GB (2.88 GB可用)
系统类型:32位操作系统
3、工具环境
A、myeclipse-8.6
B、j2sdk1.4.2_16(jdk-6u10-rc2-bin-b32-windows-i586-p-12_sep_2008.exe)
C、VC++6.0 sp6
一、IDL编写
//
// version 0.01
//

interface Time{
short get_gmt();
};

//
// EOF Time.idl
//

二、编译IDL
1、生成*.hh,*.cc
>D:\omniORB-4.1.1\src\examples\casco>omniidl -bcxx time.idl
a.time.hh
b.timeSK.cc

2、生成*.java
>D:\omniORB-4.1.1\src\examples\casco>idlj -fall Time.idl
a._TimeStub.java
b. Time.java
c. TimeHelper.java
d. TimeHolder.java
e. TimeOperations.java
f. TimePOA.java

三、JAVA客户端程序
Java客户端程序编写之后,调试过程中会碰到很多问题,笔者把调试过程的错误一一解答,以便读者在调试过程能感受这些出现的问题,加强我们对COBRA服务程序的学习。
1、File->new->java project,按完成即可。



2、把上述*.java文件复制到testomnijava/src目录下,然后按“F5”刷新更新项目。



3、COBRA的C++服务程序生成请参考我写的“Corba-omniORB简单编程-IOR”和“Cobra-omniORB简单编程-命名服务”文章。

在Unix/linux操作系统简单编译如下

a.Generate stubs and skeleton from the interface description Time.idl:

omniidl -bcxx Time.idl

b.Compile all source files:

g++ -c client.cpp -I$OMNIORB_ROOT/include -I$OMNIORB_ ROOT /include/omniORB4

g++ -c server.cpp -I$OMNIORB_ ROOT /include -I$OMNIORB_ ROOT /include/omniORB4

g++ -c Time_impl.cpp -I$OMNIORB_ ROOT /include -I$OMNIORB_ ROOT /include/omniORB4

g++ -c TimeSK.cpp -I$OMNIORB_ ROOT /include -I$OMNIORB_ ROOT /include/omniORB4

c.Link the client program:

g++ -o client client.o TimeSK.o -L$OMNIORB_ ROOT /lib -lomnithread -lomniORB4

Link the server program:

g++ -o server server.o TimeSK.o Time_impl.o -L$OMNIORB_ROOT /lib -lomnithread -lomniORB4

4、创建java客户端程序,新建一个文件testOrbClient.java,内容如下
import org.omg.CosNaming.*;
import org.omg.CORBA.*;

public class testOrbClient
{
public static void main(String args[])
{
try
{
org.omg.CORBA.Object rootContextObj, managerObj;
// 创建并初始化ORB
ORB orb = ORB.init(args, null);
// 得到一个用于访问命名服务和登记服务的命名上下文对象
rootContextObj = orb.resolve_initial_references("NameService");
// 得到一个NameComponent类型的对象
NamingContextExt nc = NamingContextExtHelper.narrow(rootContextObj);
// nc的id域为FirstTimeSevice,kind域为空字符串
NameComponent name = new NameComponent("FirstTimeSevice", "");
NameComponent path[] = { name };
// 从命名服务上下文中获得特定的命名服务对象
managerObj = nc.resolve(path);
// Narrow the previous object to obtain the correct type
Time manager = TimeHelper.narrow(managerObj);
System.out.println("OK, Let's have a look: " + manager.get_gmt());
}
catch (Exception e)
{
System.out.println("ERROR : " + e) ;
}
}
}

5、直接调试-问题1



当调试指针走到此处时会异常如下:
rootContextObj = orb.resolve_initial_references("NameService");

2012-3-10 12:46:31 com.sun.corba.se.impl.transport.SocketOrChannelConnectionImpl <init>
警告: "IOP00410201: (COMM_FAILURE) Connection failure: socketType: IIOP_CLEAR_TEXT; hostname: 60.63.133.171; port: 900"
org.omg.CORBA.COMM_FAILURE: vmcid: SUN minor code: 201 completed: No
at com.sun.corba.se.impl.logging.ORBUtilSystemException.connectFailure(ORBUtilSystemException.java:2172)
at com.sun.corba.se.impl.logging.ORBUtilSystemException.connectFailure(ORBUtilSystemException.java:2193)
at com.sun.corba.se.impl.transport.SocketOrChannelConnectionImpl.<init>(SocketOrChannelConnectionImpl.java:205)
at com.sun.corba.se.impl.transport.SocketOrChannelConnectionImpl.<init>(SocketOrChannelConnectionImpl.java:218)
at com.sun.corba.se.impl.transport.SocketOrChannelContactInfoImpl.createConnection(SocketOrChannelContactInfoImpl.java:101)
at com.sun.corba.se.impl.protocol.CorbaClientRequestDispatcherImpl.beginRequest(CorbaClientRequestDispatcherImpl.java:152)
at com.sun.corba.se.impl.protocol.CorbaClientDelegateImpl.request(CorbaClientDelegateImpl.java:118)
at com.sun.corba.se.impl.resolver.BootstrapResolverImpl.invoke(BootstrapResolverImpl.java:74)
at com.sun.corba.se.impl.resolver.BootstrapResolverImpl.resolve(BootstrapResolverImpl.java:107)
at com.sun.corba.se.impl.resolver.CompositeResolverImpl.resolve(CompositeResolverImpl.java:22)
at com.sun.corba.se.impl.resolver.CompositeResolverImpl.resolve(CompositeResolverImpl.java:22)
at com.sun.corba.se.impl.resolver.CompositeResolverImpl.resolve(CompositeResolverImpl.java:22)
at com.sun.corba.se.impl.orb.ORBImpl.resolve_initial_references(ORBImpl.java:1155)
at testOrbClient.main(testOrbClient.java:14)
Caused by: java.net.ConnectException: Connection refused: connect
at sun.nio.ch.Net.connect(Native Method)
at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:507)
at java.nio.channels.SocketChannel.open(SocketChannel.java:146)
at com.sun.corba.se.impl.transport.DefaultSocketFactoryImpl.createSocket(DefaultSocketFactoryImpl.java:60)
at com.sun.corba.se.impl.transport.SocketOrChannelConnectionImpl.<init>(SocketOrChannelConnectionImpl.java:188)
... 11 more
ERROR : org.omg.CORBA.COMM_FAILURE: vmcid: SUN minor code: 201 completed: No
注意:上述错误意味着服务没有启动!

6、启动java“tnameserv”服务。



7、直接调试-问题2

当调试指针走到此处时会异常如下:
managerObj = nc.resolve(path);
ERROR : org.omg.CosNaming.NamingContextPackage.NotFound: IDL:omg.org/CosNaming/NamingContext/NotFound:1.0

NameComponent类型的对象nc=
IOR:000000000000002b49444c3a6f6d672e6f72672f436f734e616d696e672f4e616d696e67436f6e746578744578743a312e300000000000010000000000000080000102000000000e36302e36332e3133332e31373100038400000035afabcb0000000020faf2e8980000000100000000000000010000000d544e616d65536572766963650000000000000004000000000a0000000000000100000001000000200000000000010001000000020501000100010020000101090000000100010100.
注意:上述错误意味着服务名称没有找到,从NC的值可以知道绑定服务是JAVA的服务!

8、启动omniorb的“tnameserv”服务,同时启动“testorbserver”服务程序。
Microsoft Windows [版本 6.1.7601]
版权所有 (c) 2009 Microsoft Corporation。保留所有权利。

C:\Windows\system32>omniNames

Sat Mar 10 13:01:43 2012:

Read log file successfully.
Root context is IOR:010000002b00000049444c3a6f6d672e6f72672f436f734e616d696e672f
4e616d696e67436f6e746578744578743a312e300000010000000000000070000000010102000e00
00003139322e3136382e312e31303000f90a0b0000004e616d655365727669636500030000000000
0000080000000100000000545441010000001c000000010000000100010001000000010001050901
010001000000090101000354544108000000c5a92b4f01001f2c
Checkpointing Phase 1: Prepare.
Checkpointing Phase 2: Commit.
Checkpointing completed.



Microsoft Windows [版本 6.1.7601]
版权所有 (c) 2009 Microsoft Corporation。保留所有权利。

C:\Windows\system32>testorbserver
The IOR of the object is: IOR:010000000d00000049444c3a54696d653a312e300000000001
0000000000000068000000010102000e0000003139322e3136382e312e3130300032c014000000ff
6d79504f41fe89e25a4f01001f900000000000020000000000000008000000010000000054544101
0000001c00000001000000010001000100000001000105090101000100000009010100
The server is ready. Awaiting for incoming requests...



9、直接调试

注意参数:-ORBInitRef NameService=corbaloc::localhost:2809/NameService
managerObj IOR=
000000000000000d49444c3a54696d653a312e3000000000000000010000000000000068000102000000000e3139322e3136382e312e31303000c03200000014ff6d79504f41fe89e25a4f01001f9000000000000000000200000000000000080000000041545400000000010000001c00000000000100010000000105010001000101090000000100010109.



四、总结
在COBRA中服务端使用C++语言编写的服务,客户端使用java语言编写,此例说明corba作为语言无关的中间件实现了不同资源共享,而更重要的是各种中间件以COBRA规范标准化不同产品之间的通讯实现成为可能。
JAVA在请求服务时要注意服务对象,在参数传递时需要我们关心服务对象的属性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: