使用 Oracle Java ORB 使用命名服务查找时如何指定网络接口
Posted
技术标签:
【中文标题】使用 Oracle Java ORB 使用命名服务查找时如何指定网络接口【英文标题】:How to specify the network interface when using Naming Service lookup using Oracle Java ORB 【发布时间】:2021-09-21 21:25:12 【问题描述】:因此,根据下面列出的教程,我目前正在托管一项利用 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 上且客户端位于机器 B 上时,我在缩小参考范围时遇到错误。
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 属性没有做任何事情。
【问题讨论】:
【参考方案1】:这里的问题是客户端机器正在本地搜索服务器,这就是它写连接失败的原因:socketType:IIOP_CLEAR_TEXT;主机名:127.0.1.1;端口:1060 所以在客户端代码中而不是像这样初始化属性:
String[] argv = new String[]"-ORBInitRef", "PingService=corbaloc:iiop:1.2@"
+ ORBIP + ":" + ORBPort + "/PingService";
ORB orb = ORB.init( argv, null );
尝试像这样初始化它:
Properties props = new Properties();
props.put("org.omg.CORBA.ORBInitialHost",ORBIP);
props.put("org.omg.CORBA.ORBInitialPort","1060");
ORB orb = ORB.init(args,props);
在 ORBIP 变量中将服务器 IP 地址放入 LAN 中。 您尝试了服务器上的 ORBInitialHost 属性,但它什么也没做,因为他在本地运行。客户端必须使用此属性才能知道服务器的确切托管点。
【讨论】:
以上是关于使用 Oracle Java ORB 使用命名服务查找时如何指定网络接口的主要内容,如果未能解决你的问题,请参考以下文章