使用 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 使用命名服务查找时如何指定网络接口的主要内容,如果未能解决你的问题,请参考以下文章

java CORBA Server 限制连接数

CORBA ORB

CORBA 错误:方法中的 ORB 初始化

java:Oracle()

java:Oracle(table的增删改查,data的增删改查)

Oracle为啥不支持驼峰命名法