因此,根据下面列出的教程,我目前正在托管一项利用 Oracle 的互操作命名服务 (INS) 的服务。该服务在一台机器上部署了一个servant,并将它注册到INS,我们称这台机器为A。
Properties properties = System.getProperties( );
properties.put( "com.sun.CORBA.POA.ORBPersistentServerPort",
Integer.toString(1060);
ORB orb = ORB.init( args, properties );
ServiceImpl servant = new ServiceImpl( );
POA rootPOA = POAHelper.narrow( orb.resolve_initial_references( "RootPOA" ));
rootPOA.the_POAManager().activate();
rootPOA.activate_object( servant );
((com.sun.corba.se.impl.orb.ORBImpl) orb).
register_initial_reference("PingService",
rootPOA.servant_to_reference(servant));
System.out.println( "INS Server is Ready...");
orb.run();
https://docs.oracle.com/javase/8/docs/technotes/guides/idl/INStutorial.html
当我根据教程在同一台机器上使用客户端时,一切正常。但是,当我尝试通过 LAN 进行查找时,当 INS 服务器托管在机器 A 上且客户端位于机器 BI 上时,在缩小参考范围时会出现错误。
String[] argv = new String[]{"-ORBInitRef",
"PingService=corbaloc:iiop:1.2@"
+ ORBIP + ":" + ORBPort + "/PingService"};
ORB orb = ORB.init( argv, null );
org.omg.CORBA.Object object = orb.resolve_initial_references(
"PingService" );
Service fileRef = ServiceHelper.narrow( object ); // <----- error
我将服务器设置为 192.168.0.XXX 并且机器 B 可以访问它,并且在这些线路的某处出现错误。AFAIK 正在与命名服务和位于服务中的对象建立连接,但是当它尝试查找对象时,它在机器 A 上使用了不正确的接口。然后将错误返回到机器 B。
com.sun.corba.se.impl.transport.SocketOrChannelConnectionImpl <init>
WARNING "IOP00410201: (COMM_FAILURE)Connection failure: socketType: IIOP_CLEAR_TEXT; hostname: 127.0.1.1; port:1060"
org.omg.CORBA.COMM_FAILURE: vmcid: SUN minor code: 201 completed: No
connectFailure
所以我的问题是,有没有办法准确指定命名服务在查找时可以使用哪个接口?我在 Windows 主机和 Linux 主机上都试过。linux 主机使用了一个未列出但在 /etc/hosts 文件中的 iface,Windows 主机使用了 ipconfig 中列出的最后一个接口的 IP(172.xx.. IP)。在启用网桥的 vbox 上进行了测试。有没有指定网络接口的有效方法?我的要求是服务器和客户端独立存在于同一个局域网上。在服务器上设置 ORBInitialHost 属性没有做任何事情。